概述
本文介绍了在ubuntu平台下执行交叉编译,目标是ARM平台的libwebsockets库
1. 源码下载
https://github.com/warmcat/libwebsockets
本例下载的是v4.3-stable分支的代码,直接下载了zip压缩包
也可以用git下载:
git clone https://github.com/warmcat/libwebsockets.git
2. 环境准备
设置环境变量,指定要用的交叉编译工具链,
下图为本示例的环境变量:
3. 设置交叉编译参数
打开libwebsocket的配置文件:gedit CMakeLists.txt
根据自己交叉编译工具链的绝对路径,加入下述内容
SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_FIND_ROOT_PATH "/home/XXXXXX/tools/gcc-linaro-7.5.0-2019.12-i686_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 "/home/XXXXXX/tools/gcc-linaro-7.5.0-2019.12-i686_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc")
SET(CMAKE_CXX_COMPILE "/home/XXXXXX/tools/gcc-linaro-7.5.0-2019.12-i686_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++")
说明:
这段配置是用于在交叉编译环境中配置 CMake 来正确识别和使用交叉编译工具链。下面是每个配置的含义和作用:
①. `SET(CMAKE_SYSTEM_NAME Linux)`: 这个设置告诉 CMake 目标系统的名称是 Linux,这是为了确保 CMake 使用适用于 Linux 系统的默认设置。
②. `SET(CMAKE_FIND_ROOT_PATH "/home/XXXXXX/tools/gcc-linaro-7.5.0-2019.12-i686_arm-linux-gnueabihf/bin/")`: 这个设置指定了 CMake 在搜索过程中应该查找的根路径。在交叉编译中,这是交叉编译工具链的安装路径。
③. `SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)`: 这个设置告诉 CMake 在查找可执行文件时不要在指定的根路径下查找。因为交叉编译工具链通常不会在交叉编译环境之外使用,所以不需要在根路径下查找可执行文件。
④. `SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)`: 这个设置告诉 CMake 只在指定的根路径下查找库文件。在交叉编译中,这是非常重要的,因为需要确保使用交叉编译的库而不是主机系统的库。
⑤. `SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)`: 这个设置告诉 CMake 只在指定的根路径下查找头文件。同样,在交叉编译中,这是确保使用交叉编译的头文件而不是主机系统的头文件的重要设置。
⑥. `SET(CMAKE_C_COMPILER "/home/XXXXXX/tools/gcc-linaro-7.5.0-2019.12-i686_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc")`: 这个设置指定了交叉编译时要使用的 C 编译器的完整路径。在这个例子中,指定了 ARM 架构的交叉编译 GCC。
⑦. `SET(CMAKE_CXX_COMPILE "/home/XXXXXX/tools/gcc-linaro-7.5.0-2019.12-i686_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++")`: 这个设置指定了交叉编译时要使用的 C++ 编译器的完整路径。同样,在这个例子中,指定了 ARM 架构的交叉编译 G++。
4. 关闭SSL依赖(看个人的需要)
在CMakeLists.txt文件中,做如下设置
SET(LWS_WITH_SSL OFF)
SET(LWS_WITHOUT_BUILTIN_SHA1 OFF)
option(LWS_WITH_SSL "Include SSL support (defaults to OpenSSL or similar, mbedTLS if LWS_WITH_MBEDTLS is set)" OFF)
不关闭SSL依赖,可能会出现如下报错:
Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR (missing: OPENSSL_CRYPTO_LIBRARY OPENSSL_INCLUDE_DIR)
5. 设置集成编译选项(可选,看实际需要)
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
在CMakeList.txt中增加这些配置,用于告诉编译器生成的代码在内存中的位置是无关紧要的,可以在任何地方加载并执行,而不受加载地址的限制
若不增加此配置,生成的.a文件,在集成到固件时,固件编译可能会报错:relocation R_ARM_THM_MOVW_ABS_NC against `a local symbol' can not be used when making a shared object; recompile with -fPIC
6. 编译
创建build目录, mkdir build
创建输出目录,mkdir output
cd build
cmake ../ -DCMAKE_INSTALL_PREFIX=/home/xxxxx/libwebsocket/libwebsockets-4.3-stable2/output (设置输出目录的绝对路径)
make
sudo make install
完成后会输出4个目录,头文件和库都在此