CMakeLists.txt编译报错:依赖库缺失与路径异常问题排查
问题现象
编译时提示路径/cxx/RelWithDebInfo/1k2r4e66/obj未生成,最终编译失败,核心报错及警告信息如下:
Task :app:buildCMakeRelWithDebInfo[arm64-v8a] FAILED
C/C++: CMake Warning (dev) in CMakeLists.txt:
C/C++: No project() command is present. The top-level CMakeLists.txt file must
C/C++: contain a literal, direct call to the project() command. Add a line of
C/C++: code such as
C/C++: project(ProjectName)
C/C++: near the top of the file, but after cmake_minimum_required().
C/C++: CMake is pretending there is a "project(Project)" command on the first
C/C++: line.
C/C++: This warning is for project developers. Use -Wno-dev to suppress it.
C/C++: CMake Warning at /Users/bakbeom/Library/Android/sdk/ndk/23.1.7779620/build/cmake/android-legacy.toolchain.cmake:416 (message):
C/C++: An old version of CMake is being used that cannot automatically detect
C/C++: compiler attributes. Compiler identification is being bypassed. Some
C/C++: values may be wrong or missing. Update to CMake 3.19 or newer to use
C/C++: CMake's built-in compiler identification.
C/C++: Call Stack (most recent call first):
C/C++: /Users/bakbeom/Library/Android/sdk/ndk/23.1.7779620/build/cmake/android.toolchain.cmake:55 (include)
C/C++: .cxx/RelWithDebInfo/1k2r4e66/arm64-v8a/CMakeFiles/3.18.1-g262b901/CMakeSystem.cmake:6 (include)
C/C++: ninja: error: 'src/main/jniLibs/arm64-v8a/libopencv_java4.so', needed by '/Users/bakbeom/work/HWST/build/app/intermediates/cxx/RelWithDebInfo/1k2r4e66/obj/arm64-v8a/libnative_opencv.so', missing and no known rule to make it
当前使用的CMakeLists.txt内容:
cmake_minimum_required(VERSION 3.18.1) project(HWST) add_library(lib_opencv SHARED IMPORTED) set_target_properties(lib_opencv PROPERTIES IMPORTED_LOCATION src/main/jniLibs/${ANDROID_ABI}/libopencv_java4.so) add_library(libMNN SHARED IMPORTED) set_target_properties(libMNN PROPERTIES IMPORTED_LOCATION src/main/jniLibs/${ANDROID_ABI}/libMNN.so) find_library(log-lib log) include_directories(cpp/includes/) set(HEADER_FILES cpp/detector.h cpp/FaceCubePlus.h cpp/recognizer.h) add_library(native_opencv SHARED cpp/native_opencv.cpp ${HEADER_FILES}) target_link_libraries(native_opencv lib_opencv libMNN ${log-lib})
报错原因分析
- 核心失败原因:编译依赖的
src/main/jniLibs/arm64-v8a/libopencv_java4.so文件不存在,导致ninja无法生成目标库libnative_opencv.so,进而无法创建对应的obj文件夹。 - CMake版本警告:使用的CMake版本(3.18.1)低于NDK要求的3.19版本,无法自动识别编译器属性,可能引发潜在编译问题。
- project命令警告:虽已添加
project(HWST),但CMake仍提示未检测到,大概率是缓存导致的误报,修复核心问题后可同步解决。
修复步骤
步骤1:补齐缺失的SO文件
- 检查
src/main/jniLibs/arm64-v8a/目录,确认libopencv_java4.so和libMNN.so是否存在。 - 若缺失,从OpenCV Android SDK、MNN官方包中提取对应
arm64-v8a架构的SO文件放入该目录。 - 同步补齐其他需要编译的架构(如armeabi-v7a、x86_64等)下的SO文件,避免后续其他架构编译报错。
步骤2:修正CMake路径配置
将相对路径改为绝对路径,避免CMake解析路径出错:
# 修改lib_opencv的路径配置 set_target_properties(lib_opencv PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libopencv_java4.so) # 修改libMNN的路径配置 set_target_properties(libMNN PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libMNN.so)
步骤3:升级CMake版本(可选但推荐)
- 在Android Studio中打开
File > Settings > Build, Execution, Deployment > Build Tools > CMake,将CMake版本升级到3.19及以上。 - 或修改项目根目录下的
build.gradle(项目级),指定CMake版本:
buildscript { dependencies { classpath "com.android.tools.build:gradle:7.0.0+" } } // 模块级build.gradle中配置 android { externalNativeBuild { cmake { version "3.22.1" // 选择3.19以上的稳定版本 } } }
步骤4:清理缓存重新编译
执行Build > Clean Project,再执行Build > Rebuild Project,彻底清理旧缓存,避免路径解析错误。
验证修复
重新编译项目,若核心报错消失且obj文件夹正常生成,则修复成功。CMake版本和project命令的警告会随核心问题解决或版本升级自动消失。
内容的提问来源于stack exchange,提问作者bakboem

