如何编写CMakeLists.txt适配NDK独立工具链与OLLVM生成ARM可执行文件
解决CMake编译Android ARM可执行文件却生成x86-64的问题
我来帮你排查这个问题——你遇到的核心问题是CMake没有正确识别你配置的ARM独立工具链,反而 fallback 到了主机的x86-64编译器。下面是一步步的修正方案:
1. 先确认独立工具链的有效性
首先要确保你创建的独立工具链确实是针对ARM架构的:
- 回忆你创建工具链的命令,正确的ARM(armeabi-v7a)工具链创建命令应该是这样的(替换
$NDK为你的NDK路径,api根据你的目标Android版本调整):$NDK/build/tools/make_standalone_toolchain.py --arch arm --api 21 --install-dir ./standalone-toolchain - 检查工具链的
bin目录,里面应该存在arm-linux-androideabi-gcc、arm-linux-androideabi-g++这类带ARM前缀的编译器,而不是x86相关的可执行文件。
2. 修正CMake命令行参数
你的原命令存在几个关键参数错误,导致CMake没正确切换到ARM目标:
- 废弃的参数:
-DOS=ANDROID不是CMake Android工具链的标准参数,应该用-DCMAKE_SYSTEM_NAME=Android - ABI选择:
armeabi已经被NDK废弃(r17及以后不再支持),建议改用armeabi-v7a;如果必须用armeabi,确保你的NDK版本低于r17 - 工具链路径:
ANDROID_STANDALONE_TOOLCHAIN建议使用绝对路径,避免CMake解析路径出错 - 强制指定编译器:明确指定C/C++编译器路径,防止CMake使用主机的x86-64编译器
修正后的完整CMake命令如下(替换/path/to/your/standalone-toolchain为你的工具链绝对路径):
cmake \ -DCMAKE_SYSTEM_NAME=Android \ -DCMAKE_ANDROID_ARCH_ABI=armeabi-v7a \ -DCMAKE_ANDROID_STANDALONE_TOOLCHAIN=/path/to/your/standalone-toolchain \ -DCMAKE_C_COMPILER=/path/to/your/standalone-toolchain/bin/arm-linux-androideabi-gcc \ -DCMAKE_CXX_COMPILER=/path/to/your/standalone-toolchain/bin/arm-linux-androideabi-g++ \ -DCMAKE_BUILD_TYPE=Release \ . make -j8
3. 优化你的CMakeLists.txt(可选但更严谨)
可以给你的CMakeLists.txt加上基础配置,避免潜在问题:
cmake_minimum_required(VERSION 3.10) # 匹配你的CMake版本,建议至少3.10以上 project(test C) set(CMAKE_C_STANDARD 11) # 如果你的OLLVM需要混淆编译选项,在这里添加 target_compile_options(test PRIVATE -march=armv7-a -O3 -fla -sub -bcf) add_executable(test test.c)
4. 验证编译结果
编译完成后,用file命令检查生成的可执行文件:
file test
正常的ARM可执行文件输出应该类似:
test: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /system/bin/linker, BuildID[sha1]=xxx, not stripped
如果输出里出现x86-64,请回头检查工具链路径是否正确,以及CMake命令参数是否写错。
内容的提问来源于stack exchange,提问作者EMC2
相关产品推荐
相关产品推荐

