编译Android-Object-Detection项目遇CMake编译工具未设置错误求助
问题描述
我最近在尝试编译开源项目Android-Object-Detection,折腾了好长时间都没法成功构建,每次都会触发CMake错误。我查过StackOverflow上的相关解答,但可能是自己对JNI和原生编译流程不太熟,没解决问题。我是JNI新手,对原生编译这块了解有限,以下是我遇到的错误信息:
Build command failed. Error while executing '/home/rudra/Android/Sdk/cmake/3.6.4111459/bin/cmake' with arguments {-H/home/rudra/Downloads/Projects/CVTEST/Android-Object-Detection-master/app -B/home/rudra/Downloads/Projects/CVTEST/Android-Object-Detection-master/app/.externalNativeBuild/cmake/release/armeabi -GAndroid Gradle - Ninja -DANDROID_ABI=armeabi -DANDROID_NDK=/home/rudra/Android/Sdk/ndk-bundle -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/home/rudra/Downloads/Projects/CVTEST/Android-Object-Detection-master/app/build/intermediates/cmake/release/obj/armeabi -DCMAKE_BUILD_TYPE=Release -DCMAKE_MAKE_PROGRAM=/home/rudra/Android/Sdk/cmake/3.6.4111459/bin/ninja -DCMAKE_TOOLCHAIN_FILE=/home/rudra/Android/Sdk/ndk-bundle/build/cmake/android.toolchain.cmake -DANDROID_NATIVE_API_LEVEL=21 -DCMAKE_CXX_FLAGS=-fexceptions} -- Configuring incomplete, errors occurred! (include) CMakeLists.txt Open File CMake Error: CMAKE_C_COMPILER not set, after EnableLanguage CMake Error: CMAKE_CXX_COMPILER not set, after EnableLanguage Build command failed. Error while executing '/home/rudra/Android/Sdk/cmake/3.6.4111459/bin/cmake' with arguments {-H/home/rudra/Downloads/Projects/CVTEST/Android-Object-Detection-master/app -B/home/rudra/Downloads/Projects/CVTEST/Android-Object-Detection-master/app/.externalNativeBuild/cmake/debug/armeabi -GAndroid Gradle - Ninja -DANDROID_ABI=armeabi -DANDROID_NDK=/home/rudra/Android/Sdk/ndk-bundle -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/home/rudra/Downloads/Projects/CVTEST/Android-Object-Detection-master/app/build/intermediates/cmake/debug/obj/armeabi -DCMAKE_BUILD_TYPE=Debug -DCMAKE_MAKE_PROGRAM=/home/rudra/Android/Sdk/cmake/3.6.4111459/bin/ninja -DCMAKE_TOOLCHAIN_FILE=/home/rudra/Android/Sdk/ndk-bundle/build/cmake/android.toolchain.cmake -DANDROID_NATIVE_API_LEVEL=21 -DCMAKE_CXX_FLAGS=-fexceptions} -- Configuring incomplete, errors occurred! (include) CMakeLists.txt Open File CMake Error: CMAKE_C_COMPILER not set, after EnableLanguage CMake Error: CMAKE_CXX_COMPILER not set, after EnableLanguage
解决方案
你遇到的核心问题是CMake找不到C/C++编译器,这大概率和工具版本不兼容、架构废弃或者缓存混乱有关,试试下面这些步骤:
更新CMake和NDK到兼容版本
你当前用的CMake 3.6版本太老了,和ndk-bundle的兼容性很差。打开Android Studio的SDK管理器,把CMake更新到3.18以上的稳定版本,同时确认NDK版本也更新到较新的稳定版(比如25.x系列),并在app模块的build.gradle里指定对应的版本:android { ndkVersion "25.1.8937393" // 替换成你安装的NDK版本 externalNativeBuild { cmake { path "CMakeLists.txt" version "3.18.1" // 替换成你安装的CMake版本 } } }废弃armeabi架构,改用支持的ABI
从NDK r17开始,armeabi架构已经被官方废弃,工具链不再提供对应的编译器。修改app模块build.gradle里的abi配置:android { defaultConfig { ndk { abiFilters "armeabi-v7a", "arm64-v8a" } } }手动指定编译器路径(如果更新后仍不行)
打开项目的CMakeLists.txt,在文件最开头添加以下代码,手动指定NDK里的clang编译器路径(注意替换成你系统对应的路径,比如Windows是windows-x86_64,macOS是darwin-x86_64):set(CMAKE_C_COMPILER "${ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64/bin/clang") set(CMAKE_CXX_COMPILER "${ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++")清理缓存后重新构建
先通过Android Studio的File -> Invalidate Caches...清理IDE缓存,然后删除项目根目录下的.externalNativeBuild和build文件夹,最后点击Sync Project with Gradle Files,再尝试重新构建。旧缓存经常会导致配置冲突。
内容的提问来源于stack exchange,提问作者Diaz diaz

