Android下CMake Ninja报错:文件存在却提示缺失且无构建规则
我之前也碰到过一模一样的Ninja报错——明明目标静态库就在指定路径下,构建系统却死活说找不到。结合你描述的情况(文件存在、CMake路径配置看似正确),给你几个实际有效的排查和解决方向:
检查路径大小写(Linux环境必看)
Linux是严格大小写敏感的系统,哪怕路径里一个字母的大小写不一致,Ninja都会判定为不同的路径。比如你CMake配置里写的是/root/code/CalcLib/libCalcLibAndroidX86.a(注意X大写),但实际文件是libCalcLibAndroidx86.a(x小写),就会触发这个错误。建议直接用ls -l /root/code/CalcLib/命令确认文件名的准确大小写,再对比CMakeLists.txt里的引用路径。验证CMake的依赖声明逻辑
确保你在CMakeLists.txt里正确关联了这个静态库:- 如果是直接引用预编译库,要确认
add_library的路径是绝对路径,或者相对于CMake当前工作目录的正确相对路径。比如你的CMakeLists.txt在compcorpsdk目录下,相对路径应该是../CalcLib/libCalcLibAndroidx86.a,而不是随便写的路径。 - 可以在CMakeLists.txt里加一行调试输出:
重新运行CMake后,看控制台输出的路径和实际文件路径是否完全一致。message(STATUS "Target library path: ${CMAKE_CURRENT_SOURCE_DIR}/../CalcLib/libCalcLibAndroidx86.a")
- 如果是直接引用预编译库,要确认
彻底清理构建缓存
旧的Gradle或Ninja缓存经常会导致路径错乱,哪怕你已经修正了配置。执行以下命令彻底清理后重新构建:# 清理Gradle的构建缓存 ./gradlew clean # 删除CMake生成的中间构建文件 rm -rf /root/code/compcorpsdk/build/intermediates/cmake/ # 重新执行编译 ./gradlew assembleProdRelease这样能确保构建系统从头开始生成所有配置,避免旧缓存的干扰。
检查文件权限
虽然文件存在,但Ninja运行的用户(通常是Gradle的执行用户)可能没有读取这个文件的权限。用ls -l /root/code/CalcLib/libCalcLibAndroidx86.a查看权限位,确保其他用户有读权限(比如权限是-rw-r--r--)。如果权限不足,执行chmod 644 /root/code/CalcLib/libCalcLibAndroidx86.a调整权限。确认Gradle的架构配置
你要构建的是x86架构的libJumboFFT.so,要确保Gradle的CMake配置明确指定了x86作为目标架构。比如在模块的build.gradle里:android { defaultConfig { externalNativeBuild { cmake { abiFilters 'x86' } } } }如果同时构建多个架构,要确保每个架构对应的静态库都存在,否则会出现部分架构构建失败的情况。
内容的提问来源于stack exchange,提问作者Jada




