交叉编译libwebsocket时libpthread.so.0链接错误的解决求助
解决arm-oe-linux-gnueabi交叉编译libwebsocket时的pthread链接错误
错误原因
链接器报错undefined reference to symbol 'pthread_join@@GLIBC_2.4'和DSO missing from command line,本质是编译目标(此处为线程示例程序)在链接阶段未正确关联pthread库,同时工具链的平台识别、根路径配置存在偏差,导致CMake无法定位目标平台的线程库。
修复步骤
1. 修正交叉编译工具链配置文件
修改cross-compilation.cmake中的关键配置项:
cmake_minimum_required(VERSION 3.10) set(CROSS_PATH /opt/arm-oe-linux-gnueabi-generic/bin) # 将系统名称从Generic改为Linux,让CMake识别目标为嵌入式Linux平台 set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR arm) set(BUILD_SHARED_LIBS OFF) set(CMAKE_CXX_COMPILER "${CROSS_PATH}/arm-oe-linux-gnueabi-g++") set(CMAKE_C_COMPILER "${CROSS_PATH}/arm-oe-linux-gnueabi-gcc") # 优化线程相关配置 set(CMAKE_THREAD_LIBS_INIT "-lpthread") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pthread") set(CMAKE_HAVE_THREADS_LIBRARY 1) set(CMAKE_USE_WIN32_THREADS_INIT 0) set(CMAKE_USE_PTHREADS_INIT 1) set(THREADS_PREFER_PTHREAD_FLAG ON) # 将-lpthread加入链接器flags,确保所有可执行目标都能关联线程库 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -lrt") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lpthread -lrt") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-error") # 修正根路径为目标平台sysroot,而非工具链的bin目录 set(CMAKE_FIND_ROOT_PATH /opt/arm-oe-linux-gnueabi-generic/arm-oe-linux-gnueabi/sysroot) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
2. 可选:禁用示例编译快速验证
若仅需编译libwebsocket库而非示例程序,可在CMake命令中添加-DLWS_BUILD_EXAMPLES=OFF,跳过依赖线程的示例编译,先确认库本身编译正常:
cmake .. -DCMAKE_TOOLCHAIN_FILE=../cross-compilation.cmake -DLWS_WITH_HTTP2=1 -DLWS_OPENSSL_INCLUDE_DIRS=/home/hasi/Desktop/compiled/include -DLWS_OPENSSL_LIBRARIES="/home/hasi/Desktop/compiled/lib/libssl.so;/home/hasi/Desktop/compiled/lib/libcrypto.so" -DLWS_BUILD_EXAMPLES=OFF -B .
3. 确认OpenSSL库的兼容性
确保指定的OpenSSL库是用同一套arm-oe-linux-gnueabi交叉工具链编译的,避免因架构不兼容导致间接链接错误。
原理说明
- 设置
CMAKE_SYSTEM_NAME为Linux,CMake会启用针对Linux平台的线程库查找逻辑,而非Generic的通用模式。 - 修正
CMAKE_FIND_ROOT_PATH为目标平台的sysroot目录,保证CMake查找的是arm架构的pthread库,而非宿主Ubuntu系统的x86库。 - 将
-lpthread显式加入CMAKE_EXE_LINKER_FLAGS,确保所有可执行编译目标的链接阶段都能正确关联pthread库。
内容的提问来源于stack exchange,提问作者HKP
相关产品推荐
相关产品推荐

