You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的链接错误

  1. 优先使用Android Studio官方NDK:Visual Studio捆绑的NDK与MSBuild的Android.targets深度绑定,直接用CMake调用NDK clang会缺失系统库路径注入,建议替换为Android Studio提供的官方NDK版本(如r25+)。
  2. 手动补充系统库路径(可选):若坚持使用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__宏重定义错误

  1. 降级警告级别:在EXTRA_CMAKE_ARGS中添加参数,将宏重定义警告从错误降级为警告:
    -DCMAKE_C_FLAGS="-Wno-error=macro-redefined" -DCMAKE_CXX_FLAGS="-Wno-error=macro-redefined"
    
  2. 升级CMake版本:CMake 3.25.0与NDK r23c存在兼容性问题,升级到CMake 3.26+可自动解决该宏定义冲突。
  3. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 15:30:54