undefined reference to symbol 'pthread_sigmask@@GLIBC_2.2.5' 解决方法

本文解析了在使用CMake构建项目时遇到的链接错误,具体为找不到pthread库符号'pthread_sigmask'的问题。错误源自CMakeLists.txt配置不当,未正确指定链接库位置。通过在find_package(ThreadsREQUIRED)后添加target_link_libraries命令并指定项目名称、Boost库及初始化线程库,成功解决了该问题。

/usr/bin/ld: CMakeFiles/xxxx/yyyyy.cpp.o: undefined reference to symbol 'pthread_sigmask@@GLIBC_2.2.5'
//usr/lib64/libpthread.so.0: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status

原因:

CMakeList.txt 错误

find_package(Threads REQUIRED)

之后少写了链接库位置

target_link_libraries(${PROJECT_NAME} ${Boost_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT})
 

 

 


 

你遇到的报错信息如下: ``` undefined reference to symbol 'pthread_join@@GLIBC_2.2.5' ``` 这表示 **链接器在链接时找不到 `pthread` 库中的符号 `pthread_join`**,这是 POSIX 线程库中的一个函数。 --- ## 🔍 错误原因分析 这个错误通常出现在 **编译时没有正确链接 `pthread` 库**。 虽然你的编译命令中可能包含了 `-lpthread`,但链接顺序不正确,或在某些平台上(如较新的 Linux 发行版),`pthread` 已经被集成进 `libc`,但仍然需要显式链接。 --- ## ✅ 解决方案 ### ✅ 方法一:添加 `-pthread` 编译选项(推荐) 在编译命令中添加 `-pthread` 选项,它会自动处理线程相关的编译和链接参数: ```bash gcc -o arpsd_demo demo.c -lubus -lubox -lblobmsg_json -pthread ``` > `-pthread` 不仅会链接 `libpthread`,还会定义 `_REENTRANT` 宏,确保线程安全的代码被启用。 --- ### ✅ 方法二:显式链接 `-lpthread` 并注意链接顺序 如果你坚持使用 `-lpthread`,请确保它放在所有依赖它的库 **之后**: ```bash gcc -o arpsd_demo demo.c -lubus -lubox -lblobmsg_json -lpthread ``` 错误顺序如下(可能导致问题): ```bash gcc -o arpsd_demo demo.c -lpthread -lubus -lubox -lblobmsg_json ``` --- ### ✅ 方法三:使用 Makefile 编译时添加 `LDFLAGS` 如果你使用 `Makefile`,请确保在 `LDFLAGS` 中包含 `-pthread` 或 `-lpthread`: ```makefile LDFLAGS += -lubus -lubox -lblobmsg_json -pthread ``` --- ## 🧪 示例完整编译命令 ```bash gcc -o arpsd_demo demo.c -lubus -lubox -lblobmsg_json -pthread ``` --- ## 🧩 补充知识:`pthread_join@@GLIBC_2.2.5` 是什么意思? 这是 **ELF 符号版本控制** 的一部分,表示你调用的 `pthread_join` 函数来自 GLIBC 2.2.5 及以上版本。 如果你的程序在链接时找不到这个符号,说明: - 缺少 `-pthread` 或 `-lpthread` - 使用了不兼容的 GLIBC 版本(极少见) - 使用了错误的交叉编译工具链(如在 OpenWrt SDK 中编译,但未配置好) --- ## ✅ 如果你在 OpenWrt SDK 中编译 OpenWrt 默认已经处理了线程支持,你不需要手动添加 `-pthread` 或 `-lpthread`。如果你仍然遇到问题,请确保你的 `Makefile` 中正确配置了依赖库: ```makefile define Package/arpsd-demo SECTION:=utils CATEGORY:=Utilities TITLE:=ARP Scan Demo via UBus DEPENDS:=+libubus +libblobmsgjson +libpthread endef ``` 并在 `Build/Compile` 中使用 SDK 提供的交叉编译器: ```makefile $(TARGET_CC) $(TARGET_CFLAGS) -o $(PKG_BUILD_DIR)/arpsd_demo \ $(PKG_BUILD_DIR)/demo.c \ $(TARGET_LDFLAGS) -lubus -lubox -lblobmsg_json ``` --- ## ✅ 总结 | 问题 | 原因 | 解决方案 | |------|------|-----------| | `undefined reference to 'pthread_join'` | 没有链接线程库 | 使用 `-pthread` 或 `-lpthread` | | 编译成功但运行时报错 | 系统缺少 libpthread | 安装 `libpthread-stubs0-dev` 或其他发行版对应包 | | OpenWrt SDK 中报错 | 依赖未正确声明 | Makefile 中添加 `+libpthread` | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值