在x86linux服务器基于CMake实现C++代码交叉编译和异常定位的方法

一、编译arm架构的二进制文件

1、下载ndk,由于我们的服务器是基于linux环境的,所以我们下载android-ndk-r21e-linux-x86_64.zip,然后解压到相应目录

注意:ndk的版本要匹配上,版本不一致可能编译会报错

2、安卓CMake,直接官网下载任意版本,安装即可,查看是否安装成功,可通过命令cmake -version验证,如果能查看到版本,说明安装成功了

3、编写编译C/C++代码的CMakeList文件,可配置编译动态库、静态库、可执行文件,根据需要,正常配置即可

4、编写shell脚本,新建一个run.sh脚本,该shell脚本中指定ndk环境的路径,需要编译的目标架构DANDROID_ABI,以及安卓目标版本DANDROID_NATIVE_API_LEVEL,该脚本会自动找到步骤3中的CMakeList文件去编译可执行文件,run.sh代码如下:

mkdir -p build

cd build
rm -rf *

cmake .. \
-DCMAKE_TOOLCHAIN_FILE=/xxxxx/android-ndk-r21e/build/cmake/android.toolchain.cmake \
-DANDROID_ABI="arm64-v8a" \
-DANDROID_NATIVE_API_LEVEL=android-29
make -j4
echo "编译时间:"  $(date +%T)

#DCMAKE_TOOLCHAIN_FILE为自己的ndk路径
#DANDROID_AB 可根据需要去配置不同的ABI,即cpu架构

5、编写好CMakeList文件后,运行run.sh,即可编译出自己想要的ABI 可执行文件

二、异常定位方法

采用ndk环境交叉编译还有一个好处就是可以进行程序异常定位,C/C++编译出的二进制文件,当出现程序异常或错误时,一般只是提示类似0000000000084b6c这样的一段内存地址,不会明确显示具体哪一行代码报错,这将很难定位问题;可以根据ndk工具链中的addr2line定位到具体代码报错位置。示例如下:1为自己配置ndk环境addr2line的路径,2为二进制文件的路径

命令:android-ndk-r21e/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-addr2line  -f -C -e  xxxx/bin/AC_card_agent  0000000000084b6c  

三、一些疑问解答

1、怎么查看自己的服务器属于x86还是arm64架构

可以通过uname  -a命令查看

X86服务器如下:

 arm服务器如下:

 2、如何查看编译出的二进制可执行文件是x86还是arm64

可以通过file +可执行文件名 命令查看。示例如下:

 3、为什么编译出的可执行文件没办法运行

这种情况一般是可执行文件的架构和运行环境的架构不一致导致的,可通过上面两个步骤,检查是否一致

猜你喜欢

转载自blog.csdn.net/banzhuantuqiang/article/details/131420493