Visual Studio编译Android项目时出现标识符未找到错误
问题原因拆解
从错误日志和你的配置来看,核心问题集中在以下几点:
NDK版本过旧,兼容性不足
你使用的NDK r16b是多年前的旧版本,而Ceres Solver 2.1.0是相对较新的版本。旧版NDK的llvm-libc实现存在缺陷,对现代C标准的支持不完善,导致<string.h>、等头文件中的标准函数(如strchr、memcpy)无法被正确识别。 __ANDROID_API__宏重定义导致头文件逻辑混乱
日志中明确出现__ANDROID_API__被重复定义为24和19的警告,这说明CMake命令指定的android-24与Visual Studio环境默认使用的android-19冲突。不同API级别下,系统头文件的声明逻辑不同,会直接导致标准库函数无法被正确包含。C++标准版本不匹配
Ceres Solver默认依赖较新的C标准(至少C11),而旧版NDK对高版本C标准的支持存在漏洞,若未明确指定C标准,编译时会出现头文件解析错误。
解决方案
升级NDK版本
放弃NDK r16b,升级到r21及以上版本(推荐r25或更高)。新版NDK的libc++实现更完善,能更好地兼容Ceres Solver 2.1.0的代码要求,同时修复了旧版本中的头文件声明问题。统一Android API级别
- 确保CMake命令中的
-DANDROID_NATIVE_API_LEVEL=android-24与Visual Studio项目设置一致:打开项目属性 → Android选项 → 目标SDK版本,设置为Android 24。 - 重新生成CMake项目,清除之前的build缓存,避免旧配置残留。
- 确保CMake命令中的
明确指定C++标准
在CMake命令中添加-DCMAKE_CXX_STANDARD=11(或Ceres支持的更高版本,如C14),强制编译器使用指定的C标准,避免默认标准不匹配导致的问题。修改后的CMake命令示例:cmake -G "Visual Studio 16" -A arm64 -DCMAKE_PREFIX_PATH=D:\DEV\ceres\gflags\build-gflags -DCMAKE_TOOLCHAIN_FILE="C:\Users\l.gagliano\AppData\Local\Android\Sdk\ndk\[新版本号]\build\cmake\android.toolchain.cmake" -DEigen3_DIR=D:\DEV\ceres\eigen\build -DANDROID_ABI=arm64-v8a -DANDROID_STL=c++_static -DANDROID_NATIVE_API_LEVEL=android-24 -DBUILD_SHARED_LIBS=ON -DMINIGLOG=ON -DCMAKE_CXX_STANDARD=11 D:\DEV\ceres\ceres-solver-2.1.0清理并重建项目
删除之前生成的Visual Studio解决方案和build目录,重新运行修改后的CMake命令生成项目,再进行编译。
内容的提问来源于stack exchange,提问作者user8469759

