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

CMakeLists.txt编译报错:依赖库缺失与路径异常问题排查

Android NDK编译报错修复指南

问题现象

编译时提示路径/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})

报错原因分析

  1. 核心失败原因:编译依赖的src/main/jniLibs/arm64-v8a/libopencv_java4.so文件不存在,导致ninja无法生成目标库libnative_opencv.so,进而无法创建对应的obj文件夹。
  2. CMake版本警告:使用的CMake版本(3.18.1)低于NDK要求的3.19版本,无法自动识别编译器属性,可能引发潜在编译问题。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 10:32:10