在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、为什么编译出的可执行文件没办法运行

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

粤M温同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值