为了学习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 就能生成对应的可执行文件了
注:图片来源于《程序是怎么跑起来的》