Libwebsockets (LWS) 是一个灵活、轻量级的纯 C 库,用于使用非阻塞事件循环轻松实现现代网络协议,占用空间很小。LWS 是使用MIT许可证的自由软件。
LWS 同样支持基于OpenSSL和mbedTLS tls 后端库。LWS 默认使用 poll(),但是glib、libuv、libevent和libev事件库都受支持。LWS 可用于 Linux 和 BSD(包括 Mac)等 unix 风格的平台,也可用于 Windows 甚至ESP32和 FreeRTOS。LWS库中有100+使用示例和大量的Readme说明文档。
官网地址: https://libwebsockets.org/
开源地址: https://github.com/warmcat/libwebsockets.git
1. 下载交叉工具链
Arm GNU Toolchain历史版本和下载地址:
https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-a/downloads
2. 交叉编译openssl或wolfssl
openssl库下载位置:
https://www.openssl.org/source/old/
./config no-asm shared no-async --prefix=/opt/lib/openssl-1.1.1g --cross-compile-prefix=/opt/toolchains/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
make -j8
make install
复制
wolfssl库下载位置:
https://www.wolfssl.com/download/
./configure --prefix=/opt/lib/wolfssl-3.13.0 --host=arm-linux --enable-openssh --enable-static --disable-shared
CC=/opt/toolchains/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc
make
make install
复制
3. 下载libwebsocket库文件
下载历史稳定版本或git clone最新版本:
git clone https://github.com/warmcat/libwebsockets.git
复制
4. 配置编译选项
vim CMakeLists.txt
# 设置交叉编译 -----------------------------------------------
# CMAKE_SYSTEM_NAME:指定目标机所在的操作系统名称,只有当该变量被设置了,CMake才认为此时正值交叉编译
# CMAKE_FIND_ROOT_PATH:代表一系列的相关文件夹路径的根路径的变更,所有的Find_***.cmake脚本首先会在这个路径的usr/lib,lib目录下找,然后才会去系统的目录下可>以指定多个路径
# CMAKE_FIND_ROOT_PATH_MODE_PROGRAM:有三种取值:NEVER,ONLY,BOTH ,这边选NEVER表示不在当前机器的系统目录下查找,而是去宿主机查找
# CMAKE_FIND_ROOT_PATH_MODE_LIBRARY:选ONLY表示依赖库只在交叉编译环境中找
# CMAKE_FIND_ROOT_PATH_MODE_INCLUDE:表示依赖的头文件只在交叉编译环境中找
# CMAKE_C_COMPILER CMAKE_CXX_COMPILE:指定交叉编译链gcc和g++
SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_FIND_ROOT_PATH "/opt/toolchains/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/")
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
SET(CMAKE_C_COMPILER "/opt/toolchains/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc")
SET(CMAKE_CXX_COMPILE "/opt/toolchains/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++")
#告诉编译器产生与位置无关代码(Position-Independent Code),使用相对地址
add_compile_options(-fPIC)
#关闭警告当做错误
option(DISABLE_WERROR "Avoid treating compiler warnings as fatal errors" ON
#
# TLS library options... all except mbedTLS are basically OpenSSL variants.
#
option(LWS_WITH_SSL "Include SSL support (defaults to OpenSSL or similar, mbedTLS if LWS_WITH_MBEDTLS is set)" ON)
option(LWS_WITH_MBEDTLS "Use mbedTLS (>=2.0) replacement for OpenSSL. When setting this, you also may need to specify LWS_MBEDTLS_LIBRARIES and LWS_MBEDTLS_INCLUDE_DIRS" OFF)
option(LWS_WITH_BORINGSSL "Use BoringSSL replacement for OpenSSL" OFF)
option(LWS_WITH_CYASSL "Use CyaSSL replacement for OpenSSL. When setting this, you also need to specify LWS_CYASSL_LIBRARIES and LWS_CYASSL_INCLUDE_DIRS" OFF)
option(LWS_WITH_WOLFSSL "Use wolfSSL replacement for OpenSSL. When setting this, you also need to specify LWS_WOLFSSL_LIBRARIES and LWS_WOLFSSL_INCLUDE_DIRS" OFF)
option(LWS_SSL_CLIENT_USE_OS_CA_CERTS "SSL support should make use of the OS-installed CA root certs" OFF)
option(LWS_TLS_LOG_PLAINTEXT_RX "For debugging log the received plaintext as soon as decrypted" OFF)
option(LWS_TLS_LOG_PLAINTEXT_TX "For debugging log the transmitted plaintext just before encryption" OFF)
option(LWS_WITH_TLS_SESSIONS "Enable persistent, resumable TLS sessions" ON)
option(LWS_WITH_TLS_JIT_TRUST "Enable dynamically computing which trusted TLS CA is needed to be instantiated" ON)
复制
5. CMake生成Makefile
cmake并没有提供类似于cmake clean这样的方式来让我们清除产生的缓存,可以新建一个build目录,缓存都存在本目录,清除时删除本目录所有文件即可。
mkdir build
cd build
# openssl
cmake ../ -DCMAKE_INSTALL_PREFIX=/opt/lib/libwebsockets/ -DLWS_OPENSSL_INCLUDE_DIRS="/opt/lib/openssl-1.1.1g/include/" -DLWS_OPENSSL_LIBRARIES="/opt/lib/openssl-1.1.1g/lib/libssl.so;/opt/lib/openssl-1.1.1g/lib/libcrypto.so"
# wolfssl
# 为了调试可以添加DEBUG编译选项,-DCMAKE_BUILD_TYPE=DEBUG / RELEASE
# 也可以设置 `-DLWS_LOGGING_BITFIELD_SET="LLL_INFO|LLL_DEBUG"`,这将即使在RELEASE模式下,也会导致内置这些日志级别的跟踪。
复制
6. 编译
sudo make
sudo make install
复制
7. 查看静态库/共享库架构
#查看交叉编译结果是否是ARM架构
readelf -h XXX.a
file xxx.so
复制
8. libwebsocket测试
使用编译的静态库和共享库,参考libwebsocket提供的demo示例编写程序进行测试即可。
另外,分享一个C++的websocket库,即websocketpp,开源库地址:
https://github.com/zaphoyd/websocketpp.git