暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

libwebsocket库的交叉编译和使用方法

嵌入式IoT笔记 2022-04-25
7230

Libwebsockets (LWS) 是一个灵活、轻量级的纯 C 库,用于使用非阻塞事件循环轻松实现现代网络协议,占用空间很小。LWS 是使用MIT许可证的自由软件。

LWS 同样支持基于OpenSSLmbedTLS 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

                文章转载自嵌入式IoT笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                评论