使用NDK r19c编译出现cannot find -lpthread链接错误如何解决
问题根因
Android系统的C标准库(Bionic libc)已经将pthread的所有实现直接整合到主库中,不存在独立的libpthread.so库文件。而桌面端GCC使用的Glibc将pthread拆分为独立库,所以桌面编译加-lpthread可以正常通过,NDK r18及以上版本均已完全移除独立的pthread库,链接时指定-lpthread就会触发找不到库的错误。
修复方案
- 方案1:替换硬编码的pthread链接规则(优先推荐,跨平台兼容)
修改你的CMakeLists.txt,不要直接在target_link_libraries里写pthread,改用CMake官方的线程库查找逻辑:
这套逻辑在桌面GCC环境会自动添加# 顶部添加线程库查找 find_package(Threads REQUIRED) # 替换原来的target_link_libraries(your_target pthread)写法 target_link_libraries(your_target PRIVATE Threads::Threads)-pthread编译和链接参数,在NDK环境会自动跳过添加-lpthread,不需要额外做平台判断。 - 方案2:针对NDK平台屏蔽pthread链接
如果你不想修改现有跨平台逻辑,可以加平台判断,仅在非Android平台链接pthread:if(NOT ANDROID) target_link_libraries(your_target PRIVATE pthread) endif() - 方案3:适配无法修改的第三方依赖
如果是引入的第三方库写死了-lpthread链接参数,不方便修改第三方代码,可以在你项目的CMakeLists.txt顶部添加一个空的pthread接口库,消解链接依赖:if(ANDROID) add_library(pthread INTERFACE) endif()
内容的提问来源于stack exchange,提问作者Vikash
相关产品推荐
相关产品推荐

