使用CMake为Android编译C++时pthread与posix相关错误如何解决?
问题诊断与解决方案
1. pthread相关问题修复
-lpthread找不到属于Android平台的正常表现:Android的bionic C库已经内置了pthread的全部实现,不需要单独链接libpthread,所以移除${ORX_SYSLIB_PTHREAD}的操作是正确的。- 你同事提供的宏定义不完整,且需要注意添加位置:
原检测步骤中HAVE_PTHREAD_MUTEX_ERRORCHECK和HAVE_PTHREAD_MUTEX_RECURSIVE两个检测都失败,所以需要同时手动定义这两个宏,不能只加RECURSIVE相关的定义;且宏定义要加在CMakeLists.txt执行功能检测的代码之前,不然检测阶段宏未生效,检测结果还是失败,后续代码逻辑判断时依旧不会启用对应的pthread功能。
正确的配置修改为:if (ANDROID) add_definitions(-DHAVE_PTHREAD_MUTEXATTR_SETTYPE) add_definitions(-DHAVE_PTHREAD_MUTEX_RECURSIVE) add_definitions(-DHAVE_PTHREAD_MUTEX_ERRORCHECK) endif ()
2. posix_spawnp未声明问题修复
这个是当前编译到72%失败的核心原因:
Android的bionic库从API等级28才开始正式支持posix_spawnp函数,你当前编译指定的ANDROID_NATIVE_API_LEVEL=22远低于最低要求,即使正确引入了spawn.h头文件,低版本的头文件也没有这个函数的声明和实现。
有三种可选解决方案,可根据需求选择:
方案一:提升目标API等级(最简单,优先推荐)
如果你的应用不需要兼容Android 9以下的设备(Android 9对应API 28),直接修改CMake命令中的API等级参数即可。另外使用NDK工具链时不需要手动指定CMAKE_C_COMPILER和CMAKE_CXX_COMPILER,工具链文件会自动根据ABI和API等级匹配正确的交叉编译器,手动指定环境变量中的$CC/$CXX反而可能引入宿主环境的编译器冲突。修改后的命令参考:
cmake -DCMAKE_TOOLCHAIN_FILE=~/coding/android-ndk-r22b/build/cmake/android.toolchain.cmake -DANDROID_ABI="x86" -DCMAKE_BUILD_TYPE=Release -DANDROID_NATIVE_API_LEVEL=28
方案二:替换进程创建逻辑(兼容低版本,需要修改少量代码)
如果需要兼容API 28以下的设备,可以修改SystemCommands.cpp中调用posix_spawnp的代码,在Android平台下用传统的fork()+execvp()组合替代posix_spawnp的功能,这两个函数在所有Android API等级都支持。
方案三:引入posix_spawn兼容实现
可以在项目中接入第三方的低版本Android posix_spawn兼容实现,不需要修改上层业务代码,即可在低版本API上使用posix_spawnp功能。
3. 编译验证步骤
按上述方案修改后,先删除之前编译生成的CMakeCache.txt和所有中间文件,重新执行CMake配置和编译命令即可。
内容的提问来源于stack exchange,提问作者tjk
相关产品推荐
相关产品推荐

