MAC上交叉编译ARM程序

4,801 阅读1分钟

为了学习arm汇编,我把c/c++代码编译成可执行程序,再使用gdb进行调试,相比打包成apk进行调试,会方便一些。

什么是交叉编译

编译就是把源代码转成对应CPU类型下的本地代码。

因为编译器也是程序,也有它自身的运行环境。交叉编译就是用A环境下运行的编译器生成B环境下运行的本地代码。

对于本文,就是用在Mac下的C++编译器,生成ARM下运行的本地代码。编译器由Android提供,对应的目录在:$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-g++

方式一 直接使用gcc或者clang

当只有单个文件时,直接使用gcc或者clang很方便。

设置如下环境变量:

export NDK=/Users/lanoche/Library/Android/sdk/ndk-17
export SYSROOT=$NDK/platforms/android-21/arch-arm
export CC="$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-g++ --sysroot=$SYSROOT -isysroot $NDK/sysroot -isystem $NDK/sysroot/usr/include/arm-linux-androideabi -pie -fPIC"
或者 
export CC="$NDK/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --sysroot=$SYSROOT -target armv7-linux-androideabi -gcc-toolchain $NDK/toolchains/arm-linux-androideabi-4.9/prebuitt/darwin-x86_64"

对需要编译的代码执行:$CC stack.cpp -o stack

方式二 使用CMake构建

有多个文件时,使用CMake构建工具会方便一些。

首先编写 CMakeLists.txt 文件

cmake_minimum_required(VERSION 3.15)
project(stack)
set(CMAKE_CXX_STANDARD 11)
add_executable(stack stack.cpp)

再执行cmake命令

cmake ../ \
  -DCMAKE_SYSTEM_NAME=Android \
  -DCMAKE_SYSTEM_VERSION=21 \
  -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a \
  -DCMAKE_ANDROID_NDK=/Users/lanoche/Library/Android/sdk/ndk-17 \
  -DCMAKE_ANDROID_STL_TYPE=gnustl_static

方式三 使用Clion开发工具

Clion中配置,配置路径为: Preferences | Build, Execution, Deployment | CMake

点击+号,添加一个ndk项,在Cmake Options下面加上

-DCMAKE_SYSTEM_NAME=Android -DCMAKE_ANDROID_ARCH_ABI=armeabi-v7a -DCMAKE_ANDROID_NDK=/Users/zhuyin/Library/Android/sdk/ndk-bundle -DCMAKE_SYSTEM_VERSION=19 -DCMAKE_C_FLAGS="" -DCMAKE_CXX_FLAGS="" -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=clang

使用 Build --> Rebuild 就能生成对应的可执行文件了

注:图片来源于《程序是怎么跑起来的》