cmake方式导入第三方.a静态库以及编译库时出现ninja: error: '../../../../src/libs/armeabi-v7a/xxx.a', needed by '../../.

本文详细介绍了如何在Android Studio中使用CMake进行NDK开发,包括配置静态库和头文件,以及解决常见编译错误的方法。适用于希望在Android应用中集成C语言/C++代码的开发者。

自 android studio 2.2 +后就集成了ndk开发, 自带cmake 编译器.  
编写ndk时候,配置很简单。再也不需要用android.mk配置文件。

如果要添加第三方的xx.a链接库
通常把第三方提供的h文件夹,放在cpp的include里面。
这是规范,不是必须。我的就没放,而xxx.a库放在/src/main/libs/armeabi-v7a/目录下。

本文章以添加libspeex.a连接库做例子
1.首先在/src/main/jni目录下建立一个include文件夹,
把speex官方提供的头文件文件夹拷贝到include里面

2.在app的src目录的main下,建立一个文件夹,
Libs,然后在jniLibs里面再建立一个armeabi-v7a(根据个人配置来)文件夹。
然后把libspeex.a链接库拷贝进去。

3.第三步, 动态库与头文件拷贝进去时候,是需要告诉编译器做关联的。
在app目录的src文件夹下有个CMakeLists.txt文件,我们通过它编写配置信息
将speex头文件所在目录告诉编译,在里面添加

include_directories(#将头文件所在目录告诉编译器,在里面添加
            src/main/jni/include/speex
            src/main/jni/include/libspeex
            )

我的有两个链接库,所以添加两个。

然后告诉编译器,libspeex.a在哪个目录下,并指定链接库的名称
接着添加

add_library(speex
            STATIC
            IMPORTED )  #添加预编译静态库,只需要告诉CMAKE导入项目即可

set_target_properties( speex
                      PROPERTIES IMPORTED_LOCATION
                      "${CMAKE_SOURCE_DIR}/src/main/libs/${ANDROID_ABI}/libspeex.a")

(这个路径一定要仔细检查一遍,写错了会出现下面那个错误,一脸懵逼)

 

3.1 CMake 编译时报错 
ninja: error: ......missing and no known rule to make itCMake 
编译时报错 ninja: error: ......missing and no known rule to make it

Build command failed.
Error while executing process D:\SDK\cmake\3.10.2.4988404\bin\cmake.exe with arguments 
{--build C:\Users\DELL\Desktop\sample_0820_videook\sample\app\.externalNativeBuild\cmake\debug\armeabi-v7a --target native-lib}
ninja: error: '../../../../src/libs/armeabi-v7a/libspeex.a', 
needed by '../../../../build/intermediates/cmake/debug/obj/armeabi-v7a/libnative-lib.so', 
missing and no known rule to make it

这种问题一般就是CMakeLists.txt的配置路径写错了,多检查一下动态库/静态库的路径,头文件路径


4.0 .第四步,然后修改target_link_libraries,加多一行jsoncpp
 

target_link_libraries( # Specifies the target library.
                       native-lib
                       speex

                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )

4.1 有多个这样添加:(网上例程,链接:https://www.cnblogs.com/fnlingnzb-learner/p/7593488.html)
 

#添加json库  
add_library(jsoncpp STATIC IMPORTED)  
set_target_properties(jsoncpp  
  PROPERTIES IMPORTED_LOCATION  
  ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libjsoncpp.a)  
  
#添加curl网络请求  
add_library(curl STATIC IMPORTED)  
set_target_properties(curl  
  PROPERTIES IMPORTED_LOCATION  
  ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libcurl.a)  
  
#添加加密工具(md5, base64, des, aes , asa) part-1  
add_library(crypto STATIC IMPORTED)  
set_target_properties(crypto  
  PROPERTIES IMPORTED_LOCATION  
  ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libcrypto.a)  
  
#添加加密工具(md5, base64, des, aes , asa) des加密 part-2  
add_library(ssl STATIC IMPORTED)  
set_target_properties(ssl  
  PROPERTIES IMPORTED_LOCATION  
  ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libssl.a)  
target_link_libraries(native-lib  
                      jsoncpp  
                      curl  
                      crypto  
                      ssl  
                      ${log-lib}) 

然后build一下就好了

<think> 首先,用户的问题是关于解决 Ninja 构建出现的错误:"out/build-bt201.ninja 文件 342471 行 lexing error"。用户提供了几个引用,我需要参考这些引用来帮助解决问题。引用内容是关于 Ninja 构建文件、错误处理和相关问题的。 关键问题: - 错误信息:"lexing error" 在文件路径 "out/build-bt201.ninja" 的第 342471 行。 - Lexing error 通常意味着在解析文件,语法分析器遇到了无法识别的字符或语法错误。在 Ninja 构建文件的上下文中,这可能是由于文件内容不正确造成的。 从引用中提取相关信息: - 引用[1]:展示了顶层 build.ninja 文件的结构,包括规则定义和目标声明。这提供了一个规范的例子。 - 引用[2]:讨论了构建失败,比如 swap 区大小问题导致卡住,以及解决方法是调整 swap。 - 引用[3]:关于如何通过 Ninja 构建 LLVM12,提到 build.ninja 未找到问题。 - 引用[4]:Android 构建中,CMake 找不到 Ninja,建议设置 CMAKE_MAKE_PROGRAM。 - 引用[5]:Building with Jack,提到了类似错误。 用户的具体错误是 lexing error,这指向文件内容问题。从引用[2]中,可以看到类似错误可能与系统资源有关(如 swap 大小),但核心错误是 lexing error,这更直接地表示语法错误。 可能的原因: 1. **文件损坏或无效字符**:build.ninja 文件可能被损坏,或者包含了无效字符。 2. **生成错误**:文件可能是由另一个工具(如 CMake 或 Soong)生成的,生成过程中出错。 3. **系统资源问题**:引用[2]中提到,构建卡住可能与 swap 区有关,但这可能间接导致文件生成错误。 4. **路径或配置错误**:引用[4]中提到 CMake 找不到 Ninja,但这似乎不直接相关。 解决方案步骤: 1. **检查文件内容**:直接打开 "out/build-bt201.ninja" 文件,查看第 342471 行,看看是否有明显的语法错误或无效字符。 2. **清理和重新生成**:删除构建输出文件(如整个 out 目录),然后重新运行构建命令,以确保文件被正确生成。 3. **检查生成工具**:如果文件是由 CMake 或其他工具生成的,确保这些工具配置正确。引用[4]提到设置 CMAKE_MAKE_PROGRAM,这可能相关。 4. **系统资源**:增加 swap 空间或内存,以防生成过程中因内存不足而中断。 5. **版本兼容性**:确保 Ninja 和生成工具的版本兼容。 6. **错误日志**:查看构建日志,获取更多上下文信息。 从错误细节:行号 342471 非常高,表明文件很大,可能是在大型项目中。生成的文件可能有错误。 参考用户提供的引用: - 引用[2]:解决方法是更改 swap 区大小或重新开启 swap。 - 引用[3]:安装 Ninja 和构建 LLVM12。 - 这可能暗示系统资源问题。 但针对 lexing error,核心应是语法问题。建议用户手动检查文件。 结构化回答: - 解释错误:"lexing error" 意味着语法解析错误。 - 提供解决方法:基于引用和一般知识。 - 生成相关问题:作为系统指令要求。 回答结构: 1. **引言**:解释错误。 2. **解决方案**:逐步建议。 3. **相关问题**:生成几个相关问题。 相关问题需基于此主题生成,例如: 1. Ninja 构建文件常见错误有哪些? 2. 如何调试 Ninja 构建问题? 3. NinjaCMake 集成的最佳实践? 确保使用中文回答。 最终回答大纲: - 使用系统级指令:行内数学表达式用 $...$,如果涉及;独立公式用 $$...$$;但这里可能不需要数学公式。 - 引用添加标识:[^1], [^2], 等。 - 内容: - 解释错误。 - 建议检查文件内容。 - 建议清理和重建。 - 参考资源问题(如 swap)。 - 生成相关问题。 </think> ### 解决 Ninja 构建出现 "out/build-bt201.ninja 文件 342471 行 lexing error" 错误的方法 "Lexing error" 表示语法解析错误,通常发生在 Ninja 构建文件(如 `build-bt201.ninja`)中存在无效字符、语法错误或文件损坏。这种错误可能由生成工具(如 CMake、Soong)的输出问题、系统资源不足或文件损坏引起。参考您提供的引用和常见实践,以下是逐步解决方法: #### 1. **检查文件内容以定位语法错误(优先推荐)** - **原因**:第 342471 行可能存在非法字符(如未闭合的引号、特殊符号)或格式错误。引用[1]展示了正确的 `build.ninja` 语法(如 `rule cc` 定义规则),但生成的文件可能因工具错误而包含异常内容。 - **步骤**: - 使用文本编辑器(如 Vim 或 VS Code)打开 `out/build-bt201.ninja` 文件。 - 直接跳转到第 342471 行(例如在 Vim 中使用 `:342471`)。 - 检查该行附近是否有: - 未闭合的括号或引号,例如 `command = gcc -c $in -o $out` 缺少分号或引号不匹配。 - 非法字符(如不可见控制字符或 UTF-8 编码问题)。 - 规则定义错误(如缺少 `rule` 关键字)。 - **修复**:手动编辑该行以修正语法(例如删除无效字符或修正格式),然后重新运行构建命令 `ninja`。 - 如果文件过大无法打开,尝试拆分文件或使用命令行工具(如 `sed '342471q;d' out/build-bt201.ninja` 提取该行内容)。 #### 2. **清理构建输出并重新生成文件** - **原因**:构建缓存损坏或生成工具(如 CMake、Soong)出错可能导致无效的 `.ninja` 文件。引用[2]和[4]提到类似错误(如构建卡顿或文件未找到),通常通过清理重建解决[^2][^4]。 - **步骤**: - 删除整个构建输出目录(例如 `rm -rf out/`)。 - 重新运行生成工具: - 如果使用 CMake:确保 `CMAKE_MAKE_PROGRAM` 设置为 Ninja 路径(例如 `cmake -G Ninja -DCMAKE_MAKE_PROGRAM=/usr/bin/ninja ..`),如引用[4]所述[^4]。 - 如果使用 Android Soong:运行 `m clean` 或重新初始化构建环境。 - 重新执行构建命令(如 `ninja` 或 `make`)。 - **注意**:确保 Ninja 版本更新(使用 `ninja --version` 检查),老版本可能有兼容性问题。 #### 3. **检查系统资源问题** - **原因**:内存或 swap 区不足可能导致文件生成中断,引发部分损坏的 `.ninja` 文件。引用[2]提到 swap 区停用导致构建失败,重新启用后解决[^2]。 - **步骤**: - 检查系统内存和 swap 使用:`free -h`。 - 如果 swap 不足(如引用[2]场景),扩展 swap 区: ```bash sudo fallocate -l 4G /swapfile # 创建 4GB swap 文件 sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile ``` - 重新运行构建工具(如 `make` 或 `ninja`)。 #### 4. **验证生成工具配置** - **原因**:如果 `.ninja` 文件由 CMake 等工具生成,配置错误可能导致语法错误。引用[3]和[4]强调了工具链设置的重要性[^3][^4]。 - **步骤**: - 确保生成工具正确安装(例如 Ninja:`sudo apt install ninja-build`)。 - 检查 CMake 或 Soong 的日志文件(如 `CMakeCache.txt` 或 `out/soong.log`),确认无警告或错误。 - 更新项目依赖:如引用[3]所述,下载完整源代码并重试[^3]。 #### 5. **启用详细日志以获取更多信息** - 运行构建添加 `-v` 或 `-d` 标志(如 `ninja -v`),这会输出详细解析过程,帮助定位错误上下文。 如果以上步骤无效,错误可能源于项目特定问题(如自定义构建脚本缺陷)。建议提供错误日志片段以进一步诊断。 ### 相关问题 1. Ninja 构建文件中常见的语法错误有哪些?如何避免? 2. 如何处理大型项目中 Ninja 构建文件过大导致的解析问题? 3. CMake 生成 Ninja 构建文件有哪些常见配置错误? [^1]: 引用[1]:顶层 build.ninja 文件:定义编译规则和包含子项目。 [^2]: 引用[2]:构建卡顿或失败,重新更改 swap 区大小解决。 [^3]: 引用[3]:如何通过 Ninja 构建 LLVM12,包括安装和项目下载。 [^4]: 引用[4]:CMake 找不到 Ninja 的解决方案。 [^5]: 引用[5]:Building with Jack 相关错误。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值