Build Android NDK Toolchain From Source Code

本文介绍如何从源代码构建Android NDK工具链。首先下载最新版本的Android NDK,然后安装必要的库文件,最后使用提供的脚本重建库。文中提供了两个示例命令来构建不同GCC和GDB版本的工具链。

Android NDK comes with a few toolchains under the toolchain directory. We can also build our own toolchain from the source code.

0. Download Latest Android NDK (r8c at the time of writing) from Android NDK website at http://developer.android.com/tools/sdk/ndk/index.html. Extract the downloaded archive.

$ tar xvf android-ndk-r8c-linux-x86.tar.bz2

1. Get into the ndk directory. Download the Android NDK source code to the src directory.

$ cd android-ndk-r8c/
$ ./build/tools/download-toolchain-sources.sh src

2. Install the following libraries

sudo apt-get install libncurses5-dev
sudo apt-get install texinfo
sudo apt-get install bison
sudo apt-get install flex

3. Rebuild the library is just one command. Below are two commands build two different toolchains with different versions of GCC and GDB.

./build/tools/build-gcc.sh –verbose –gdb-version=6.6 $(pwd)/src $(pwd) arm-linux-androideabi-4.6

./build/tools/build-gcc.sh –verbose –gdb-version=7.3.x $(pwd)/src $(pwd) arm-linux-androideabi-4.7

The toolchain built can be found under toolchains directory of the Android NDK folder.


原文http://www.roman10.net/2012/11/19/build-android-ndk-toolchain-from-source-code/

Detecting C compiler ABI info failed to compile with the following output: Change Dir: D:/java/javacode/nmmp/nmm-protect/build/.cxx/cmake/Release/armeabi-v7a/CMakeFiles/CMakeTmp Run Build Command(s):D:\Android\Cmake\cmake-3.22.2-windows-x86_64\bin\ninja cmTC_cec21 && [1/2] Building C object CMakeFiles/cmTC_cec21.dir/CMakeCCompilerABI.c.o FAILED: CMakeFiles/cmTC_cec21.dir/CMakeCCompilerABI.c.o D:\Android\AndroidNDK\android-ndk-r21e-windows-x86_64\android-ndk-r21e\toolchains\llvm\prebuilt\windows-x86_64\bin\clang.exe --target=armv7-none-linux-androideabi21 --gcc-toolchain=D:/Android/AndroidNDK/android-ndk-r21e-windows-x86_64/android-ndk-r21e/toolchains/llvm/prebuilt/windows-x86_64 --sysroot=D:/Android/AndroidNDK/android-ndk-r21e-windows-x86_64/android-ndk-r21e/toolchains/llvm/prebuilt/windows-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_cec21.dir/CMakeCCompilerABI.c.o -MF CMakeFiles\cmTC_cec21.dir\CMakeCCompilerABI.c.o.d -o CMakeFiles/cmTC_cec21.dir/CMakeCCompilerABI.c.o -c D:/Android/Cmake/cmake-3.22.2-windows-x86_64/share/cmake-3.22/Modules/CMakeCCompilerABI.c ninja: build stopped: subcommand failed. Determining if the C compiler works failed with the following output: Change Dir: D:/java/javacode/nmmp/nmm-protect/build/.cxx/cmake/Release/armeabi-v7a/CMakeFiles/CMakeTmp Run Build Command(s):D:\Android\Cmake\cmake-3.22.2-windows-x86_64\bin\ninja cmTC_9ef40 && [1/2] Building C object CMakeFiles/cmTC_9ef40.dir/testCCompiler.c.o FAILED: CMakeFiles/cmTC_9ef40.dir/testCCompiler.c.o D:\Android\AndroidNDK\android-ndk-r21e-windows-x86_64\android-ndk-r21e\toolchains\llvm\prebuilt\windows-x86_64\bin\clang.exe --target=armv7-none-linux-androideabi21 --gcc-toolchain=D:/Android/AndroidNDK/android-ndk-r21e-windows-x86_64/android-ndk-r21e/toolchains/llvm/prebuilt/windows-x86_64 --sysroot=D:/Android/AndroidNDK/android-ndk-r21e-windows-x86_64/android-ndk-r21e/toolchains/llvm/prebuilt/windows-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -fPIE -MD -MT CMakeFiles/cmTC_9ef40.dir/testCCompiler.c.o -MF CMakeFiles\cmTC_9ef40.dir\testCCompiler.c.o.d -o CMakeFiles/cmTC_9ef40.dir/testCCompiler.c.o -c D:/java/javacode/nmmp/nmm-protect/build/.cxx/cmake/Release/armeabi-v7a/CMakeFiles/CMakeTmp/testCCompiler.c ninja: build stopped: subcommand failed.这个错误是怎么回事
最新发布
08-05
<think>我们正在处理一个在构建Android NDK项目时遇到的CMake错误。错误信息显示在检测C编译器ABI信息时失败,并且ninja构建失败,具体是在编译CMakeCCompilerABI.c和testCCompiler.c时clang.exe编译出错。 根据引用[1]和引用[2]中的错误信息,以及引用[3]中关于CMake配置的说明,我们可以分析可能的原因和解决方案。 ### 错误原因分析 1. **编译器路径问题**:CMake可能无法找到正确的编译器路径,或者路径中包含空格或特殊字符导致问题。 2. **权限问题**:编译器可能没有足够的权限在目标目录中创建文件(例如,尝试写入系统目录或受保护的目录)。 3. **环境变量问题**:可能缺少必要的环境变量,或者环境变量配置错误。 4. **NDK版本与CMake版本不兼容**:使用的NDK版本和CMake版本可能存在兼容性问题。 5. **防病毒软件干扰**:某些防病毒软件可能会阻止编译器的执行或文件的创建。 6. **文件路径过长**:在Windows平台上,文件路径长度超过260个字符可能导致问题。 7. **CMake配置错误**:CMakeLists.txt中的配置可能有误,例如错误的NDK路径或编译器标志。 ### 解决方案 #### 1. 检查NDK和CMake版本兼容性 确保使用的NDK版本与CMake版本兼容。可以参考Android官方文档关于NDK和CMake的兼容性说明。例如,引用[3]中提到,CMake 3.21及之后版本有内置的NDK支持,因此可以简化配置。如果使用较新的CMake版本,可以尝试使用内置支持,而不是通过工具链文件。 #### 2. 验证CMake配置 在CMakeLists.txt中,确保正确设置了NDK路径和Android相关参数。例如,引用[3]中给出的配置示例: ```cmake cmake_minimum_required(VERSION 3.22.1) set(CMAKE_SYSTEM_NAME Android) set(CMAKE_ANDROID_ARCH_ABI arm64-v8a) set(CMAKE_SYSTEM_VERSION 21) set(CMAKE_ANDROID_STL_TYPE c++_shared) set(CMAKE_ANDROID_NDK /xxxx/Android/sdk/ndk/21.4.7075529) # 替换为你的NDK路径 project("my_project") ``` 注意:如果使用内置支持,则不需要指定工具链文件(即不需要`-DCMAKE_TOOLCHAIN_FILE`参数)。但如果你使用较旧的CMake版本,则可能需要通过工具链文件来配置。 #### 3. 检查路径和权限 - 确保NDK和CMake的安装路径中没有空格或特殊字符(例如,避免使用`Program Files`这样的目录)。 - 确保项目路径尽量短,避免路径过长问题。 - 确保构建目录有写入权限(例如,不要将项目放在系统保护目录中)。 #### 4. 检查防病毒软件 临时禁用防病毒软件,然后重新构建,看是否问题解决。如果问题消失,则需要将构建目录添加到防病毒软件的排除列表中。 #### 5. 手动测试编译器 打开命令提示符,尝试手动运行编译器命令。例如,使用引用的错误信息中的编译器路径: ```bash C:/Users/Administrator/AppData/Local/Android/Sdk/ndk/23.1.7779620/toolchains/llvm/prebuilt/windows-x86_64/bin/clang.exe --version ``` 如果这个命令失败,可能是环境变量问题或编译器损坏。尝试重新安装NDK。 #### 6. 查看详细日志 错误信息中提到了一个输出日志文件(例如`CMakeOutput.log`或`CMakeError.log`),查看这些日志文件可以获取更详细的错误信息。根据引用[2]中的提示,查看`CMakeOutput.log`文件,可能包含编译失败的具体原因。 #### 7. 尝试使用不同的构建系统 如果使用ninja出现问题,可以尝试切换到其他构建系统(如Make)。在CMake配置时,使用`-G"Unix Makefiles"`代替`-GNinja`(注意:在Windows上,可能需要安装Make工具)。 #### 8. 更新或回退CMake和NDK版本 尝试更新CMake和NDK到最新版本,或者回退到已知稳定的版本。有时,新版本可能存在兼容性问题。 ### 示例解决方案步骤 假设我们使用CMake 3.22.1和NDK r21e(如用户原始命令中所示): 1. 确保CMakeLists.txt配置正确,特别是NDK路径和ABI设置。 2. 清理构建目录(删除`build`目录或`.cxx`目录)并重新构建。 3. 如果问题依旧,尝试在命令行中手动运行CMake命令,检查输出。 如果手动运行命令,可以复制用户原始命令中的参数,但注意调整路径为实际路径: ```bash cmake -H"D:\java\javacode\nmmp\nmm-protect\build\dex2c" -DCMAKE_TOOLCHAIN_FILE="D:\Android\AndroidNDK\android-ndk-r21e-windows-x86_64\android-ndk-r21e\build\cmake\android.toolchain.cmake" -DCMAKE_BUILD_TYPE=Release -DANDROID_ABI=armeabi-v7a -DANDROID_NDK="D:\Android\AndroidNDK\android-ndk-r21e-windows-x86_64\android-ndk-r21e" -DANDROID_PLATFORM=android-21 -DCMAKE_ANDROID_ARCH_ABI=armeabi-v7a -DCMAKE_ANDROID_NDK="D:\Android\AndroidNDK\android-ndk-r21e-windows-x86_64\android-ndk-r21e" -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_LIBRARY_OUTPUT_DIRECTORY="D:\java\javacode\nmmp\nmm-protect\build\obj\sym\armeabi-v7a" -DCMAKE_MAKE_PROGRAM="D:\Android\Cmake\cmake-3.22.2-windows-x86_64\bin\ninja" -DCMAKE_SYSTEM_NAME=Android -DCMAKE_SYSTEM_VERSION=21 -B"D:\java\javacode\nmmp\nmm-protect\build\.cxx\cmake\Release\armeabi-v7a" -GNinja ``` 注意:在Windows上,路径中的反斜杠可能需要转义,或者使用正斜杠。另外,如果路径包含空格,一定要用双引号括起来。 ### 常见错误点 - **工具链文件选择错误**:确保使用的工具链文件与NDK版本匹配。在NDK r21e中,工具链文件位于`build/cmake/android.toolchain.cmake`。 - **ABI设置不一致**:在多个参数中设置ABI(如`-DANDROID_ABI`和`-DCMAKE_ANDROID_ARCH_ABI`),确保它们一致(例如都是`armeabi-v7a`)。 - **使用过时的参数**:在较新的CMake版本中,一些参数可能已经废弃,例如`-DCMAKE_MAKE_PROGRAM`可能不再需要,因为CMake可以自动找到Ninja。 ### 总结 根据以上分析,建议按照以下步骤尝试解决: 1. 检查并修正CMakeLists.txt中的配置。 2. 清理构建目录并重新构建。 3. 手动运行CMake命令,查看详细错误。 4. 检查编译器是否正常工作(手动运行clang.exe)。 5. 查看日志文件(CMakeOutput.log和CMakeError.log)。 如果问题仍然存在,请提供更详细的日志信息以便进一步分析。 §§相关问题§§ 1. 如何解决Android NDK构建中的C编译器检测失败问题? 2. CMake与Android NDK版本兼容性如何确定? 3. 在Windows上构建Android NDK项目时需要注意哪些常见问题? 4. 如何正确配置CMakeLists.txt以使用Android NDK?</think>### CMake 检测 C 编译器 ABI 信息失败的分析与解决 您在配置 Android NDK 项目时遇到的 C 编译器检测失败问题,通常由以下原因导致: #### 核心问题原因 1. **编译器路径配置错误** - CMake 无法找到有效的 NDK 工具链路径(常见于路径包含空格或特殊字符)[^1] - NDK 版本与 CMake 不兼容(如使用旧版工具链配置) 2. **环境变量冲突** - 多个 NDK 版本同时存在导致路径解析混乱 - 系统环境变量 `ANDROID_NDK_HOME` 未设置或指向错误位置[^4] 3. **文件权限问题** - 防病毒软件阻止编译器创建临时文件(特别是 Windows 的 `nul` 设备) - 项目目录缺少写入权限[^1] 4. **CMake 配置错误** - `CMAKE_TOOLCHAIN_FILE` 指向无效的 NDK 工具链文件 - ABI 架构与 NDK 版本不匹配(如 arm64-v8a 使用 32 位工具链)[^3] --- ### 解决方案步骤 #### 第一步:验证 NDK 路径配置 1. 在 `build.gradle` 中显式指定 NDK 路径: ```groovy android { ndkVersion "21.4.7075529" // 使用已知兼容版本 externalNativeBuild { cmake { path "src/main/cpp/CMakeLists.txt" // 显式设置工具链文件 arguments "-DANDROID_NDK=${android.ndkDirectory}" } } } ``` 2. 在 `CMakeLists.txt` 中添加路径验证: ```cmake message(STATUS "ANDROID_NDK = ${ANDROID_NDK}") message(STATUS "CMAKE_TOOLCHAIN_FILE = ${CMAKE_TOOLCHAIN_FILE}") ``` #### 第二步:修复编译器检测问题 1. **更新 CMake 配置**(适用于 CMake ≥3.21): ```cmake cmake_minimum_required(VERSION 3.22.1) set(CMAKE_SYSTEM_NAME Android) set(CMAKE_ANDROID_ARCH_ABI arm64-v8a) # 匹配实际架构 set(CMAKE_SYSTEM_VERSION 24) # ≥ minSdkVersion set(CMAKE_ANDROID_NDK $ENV{ANDROID_NDK_HOME}) # 从环境变量读取[^3] ``` 2. **手动测试编译器**: ```bash # 在终端执行(替换实际路径) $NDK/toolchains/llvm/prebuilt/windows-x86_64/bin/clang.exe --version ``` #### 第三步:解决权限问题 1. 将项目移到简单路径(如 `C:/projects/`) 2. 临时禁用防病毒软件 3. 以管理员身份运行 Android Studio #### 第四步:检查关键日志 查看 `CMakeOutput.log` 和 `CMakeError.log`(通常在 `app/.cxx/` 目录): ```log # 示例错误日志 Check for working C compiler: .../clang.exe - broken Could not open nul for writing ``` --- ### 完整配置示例 ```cmake cmake_minimum_required(VERSION 3.22) set(CMAKE_SYSTEM_NAME Android) set(CMAKE_ANDROID_ARCH_ABI arm64-v8a) set(CMAKE_SYSTEM_VERSION 24) set(CMAKE_ANDROID_NDK "D:/Android/sdk/ndk/25.1.8937393") # 绝对路径 set(CMAKE_ANDROID_STL c++_shared) project("native-lib") add_library(native-lib SHARED native-lib.cpp) ``` > **关键提示**:使用 CMake ≥3.21 时无需 `CMAKE_TOOLCHAIN_FILE`,新版已内置 NDK 支持[^3] [^1]: 错误显示编译器无法创建 `nul` 设备文件,表明存在权限问题 [^3]: CMake 3.21+ 内置 NDK 支持可简化配置 [^4]: NDK 路径未正确配置是常见失败原因
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值