使用Android Studio NDK编译Boost for Android时遇链接错误求助
std::__ndk1::locale::~locale()未定义引用错误 这个问题的核心原因很明确:你使用的Boost库编译时依赖的STL和当前项目配置的STL不匹配。
问题拆解
你用到的libboost_filesystem-clang-mt-a32-1_66.a是用Clang编译的,而Clang在NDK环境下默认会使用LLVM的libc++(对应NDK里的c++_shared/c++_static),这个STL的符号命名空间是std::__ndk1。但你项目里设置的-DANDROID_STL=gnu_shared/gnu_static对应的是GNU的libstdc++,它的符号命名空间是std::__gnu_cxx,两者的符号完全不兼容,所以才会出现未定义引用的错误。
解决方案
按以下步骤调整配置,确保STL一致:
修改CMakeLists.txt的STL配置
将原来的-DANDROID_STL=gnu_shared或gnu_static替换为:set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DANDROID_STL=c++_shared") # 或者如果Boost是静态链接STL的话用c++_static # set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DANDROID_STL=c++_static")或者在外部构建参数里直接指定:
set(ANDROID_STL "c++_shared")同步gradle配置(如果有)
如果你的gradle文件里也配置了externalNativeBuild的参数,需要同步修改:android { defaultConfig { externalNativeBuild { cmake { arguments "-DANDROID_STL=c++_shared" } } } }验证Boost库的编译STL(可选)
如果你是自己编译的Boost库,要确保编译时指定了和项目一致的STL。编译Boost for Android时,需要在b2命令里添加:b2 ... toolset=clang-android cxxflags="-stdlib=libc++" linkflags="-stdlib=libc++" ...这样生成的Boost库才会依赖
libc++,和项目配置完全匹配。清理并重建项目
改完配置后,一定要执行Build -> Clean Project,然后再重新构建,避免旧的缓存导致配置不生效。
为什么之前的gnu系列配置没用?
因为gnu_shared/gnu_static对应的是GNU维护的libstdc++,而Clang编译的Boost库默认绑定的是LLVM的libc++,两个STL的实现细节和符号命名空间完全不同,自然无法互相链接。
内容的提问来源于stack exchange,提问作者holopekochan

