Windows下用CMake构建Oboe C++库的编译错误问题
构建Oboe库时的CMake错误解决方案
问题背景
在Windows平台使用CMake 3.25.0 + Visual Studio 2022生成器构建Oboe库,目标是开发基于Oboe的Android C++音频库,希望脱离Android Studio纯用CMake完成构建。已成功用相同流程构建简单静态库,但构建Oboe时出现两类错误。使用NDK自带的android.toolchain.cmake工具链,编写了参考Oboe官方build_all_android.sh的批处理脚本,用于批量生成多ABI版本。
错误1:使用Visual Studio自带NDK时编译失败
运行脚本后,CMake提示C编译器无法编译测试程序,链接阶段报错找不到crtbegin_so.o、-llog、-landroid等文件/库,同时伴随__ANDROID_API__宏重定义警告。关键错误日志:
-- Check for working C compiler: C:/Microsoft/AndroidNDK/android-ndk-r23c/toolchains/llvm/prebuilt/windows-x86_64/bin/clang.exe - broken ld: error: cannot open crtbegin_so.o: No such file or directory ld: error: unable to find library -llog ld: error: unable to find library -landroid ld: error: cannot open crtend_so.o: No such file or directory
错误2:使用Android Studio自带NDK时构建失败
CMake可正常生成项目,但编译阶段出现__ANDROID_API__宏重定义错误(警告被升级为错误导致中断):
<command line>(1,9): error : '__ANDROID_API__' macro redefined [-Werror,-Wmacro-redefined] #define __ANDROID_API__ 16 ^ <built-in>(394,9): note: previous definition is here #define __ANDROID_API__ __ANDROID_MIN_SDK_VERSION__
解决方案
针对Visual Studio自带NDK的链接错误
- 优先使用Android Studio官方NDK:Visual Studio捆绑的NDK与MSBuild的Android.targets深度绑定,直接用CMake调用NDK clang会缺失系统库路径注入,建议替换为Android Studio提供的官方NDK版本(如r25+)。
- 手动补充系统库路径(可选):若坚持使用VS自带NDK,需在CMake参数中添加对应API级别的系统库路径:
注意将set EXTRA_CMAKE_ARGS=-DBUILD_SHARED_LIBS=true -DANDROID_TOOLCHAIN=clang -DANDROID_STL=c++_static ^ -DCMAKE_EXE_LINKER_FLAGS="-L%ANDROID_NDK%\platforms\android-%MINIMUM_API_LEVEL%\arch-%ARCH%\usr\lib"%ARCH%替换为对应ABI的架构(如x86、arm等)。
针对__ANDROID_API__宏重定义错误
- 降级警告级别:在
EXTRA_CMAKE_ARGS中添加参数,将宏重定义警告从错误降级为警告:-DCMAKE_C_FLAGS="-Wno-error=macro-redefined" -DCMAKE_CXX_FLAGS="-Wno-error=macro-redefined" - 升级CMake版本:CMake 3.25.0与NDK r23c存在兼容性问题,升级到CMake 3.26+可自动解决该宏定义冲突。
- 修改Oboe配置(可选):找到Oboe中手动定义
__ANDROID_API__的代码,替换为使用NDK原生的__ANDROID_MIN_SDK_VERSION__宏。
优化后的批处理脚本
@echo OFF set BUILD_DIR=build set ANDROID_NDK=C:\Android\Sdk\ndk\25.2.9519653 set GENERATOR="Visual Studio 17 2022" set CMAKE_GENERATOR=-G %GENERATOR% set CMAKE_TOOLCHAIN_FILE=-DCMAKE_TOOLCHAIN_FILE=%ANDROID_NDK%\build\cmake\android.toolchain.cmake set CMAKE_SYSTEM_NAME=-DCMAKE_SYSTEM_NAME=Android set EXTRA_CMAKE_ARGS=-DBUILD_SHARED_LIBS=true -DANDROID_TOOLCHAIN=clang -DANDROID_STL=c++_static ^ -DCMAKE_C_FLAGS="-Wno-error=macro-redefined" ^ -DCMAKE_CXX_FLAGS="-Wno-error=macro-redefined" CALL :build_android armeabi-v7a ARM 16 CALL :build_android arm64-v8a ARM64 21 CALL :build_android x86_64 x64 21 CALL :build_android x86 x86 16 EXIT /B %ERRORLEVEL% :build_android set ABI_VERSION=%~1 set GENERATOR_PLATFORM=%~2 set MINIMUM_API_LEVEL=%~3 set CMAKE_ANDROID_ARCH_ABI=-DANDROID_ABI=%ABI_VERSION% set ABI_BUILD_DIR=%BUILD_DIR%\%ABI_VERSION% set CMAKE_GENERATOR_PLATFORM=-A %GENERATOR_PLATFORM% set CMAKE_BUILD_DIR=-B %ABI_BUILD_DIR% set CMAKE_MIN_API=-DANDROID_PLATFORM=android-%MINIMUM_API_LEVEL% set CMAKE_ARGS=%CMAKE_BUILD_DIR% %CMAKE_ANDROID_ARCH_ABI% %CMAKE_GENERATOR% %CMAKE_GENERATOR_PLATFORM% %CMAKE_SYSTEM_NAME% %CMAKE_TOOLCHAIN_FILE% %CMAKE_MIN_API% echo building for android ABI: %ABI_VERSION% echo cmake arguments = %CMAKE_ARGS% echo: cmake %CMAKE_ARGS% %EXTRA_CMAKE_ARGS% echo: cmake --build %ABI_BUILD_DIR% --target ALL_BUILD --config Release echo: echo: EXIT /B 0
内容的提问来源于stack exchange,提问作者hjq
相关产品推荐
相关产品推荐

