1)安装编译工具

编译工具链接 有多种版本交叉编译工具
我实际使用的是arm-none-linux-gnueabi,其他可能会出错

2)制作makefile

在linux编译过程中,常用到cmake进行编译,所以需要做makefile
可以在以下链接学习,不需要全看只需要确保能看懂别人的makefile文件即可
makefile编写
tips:: 在linux环境中进行编译的过程中,编译完成后的文件往往不能在安卓中运行,需要查看
编译的指令中采用的是动态编译还是静态编译
如果是动态编译,需要安卓运行环境中有相应的库文件,但是往往没有,所以最好在编译过程中
最好采用静态编译,让所有库文件直接保存在执行文件中,这样就不会出错
如需静态编译只需要加入-static -lm
–dynamic-linker=/system/bin/linker这条指令代表动态链接,将其修改为上一条就行
往往在工具编译过程中会把编译文件分散,在修改编译指令的过程中需要注意,修改makefile中的编译器为你使用的编译器,将指令按照你的需求进行响应修改

这是一些常用的指令链接

3)编译错误问题解析

在linux平台交叉编译第三方工具给安卓使用的时候会存在第三方库问题,例如libaio这个库就存在arm架构和x86架构这两种方式,在交叉编译过程中会导致无法识别到对应架构的库,导致编译失败,怎么判断编译是否出现了这种问题呢。

  1. 在正常交叉编译过程中出现了,查找不到头文件的问题

如何在android手机运行clang交叉编译的test_linux

  1. 在正常交叉编译过程中出现了,undefined reference to `io_destroy’,意味着没法找到实现函数的位置,也就是链接不到.a或者.so相应的库文件

如何在android手机运行clang交叉编译的test_第三方库_02

如果出现了上述两种情况,意味着在你的环境中没有相应的库,这个时候你可以考虑安装正常的库,例如libaio.h就是对应libaio-dev这个工具的安装,安装完以后运行ldconfig把这个库对应的.h,.a,.so建立链接,这样就可以进行验证了,先为本身环境进行编译看能否成功,如果能成功,就意味着这个库的环境已经配好,此时在为安卓进行交叉编译,如果成功就意味着编译没有问题,但如果提示缺少头文件,或者缺少实现函数,就意味着本身环境中的安装好的库无法给交叉编译环境使用(这个地方存在一种情况没有验证,就是交叉编译环境是不会使用本身环境中的库,所以如果对应工具需要第三方库时,无论你在本身环境装什么库,都无法给交叉环境使用,因为本身环境的库对应的是x86架构,而交叉编译工具链的库则是对应arm架构,但是验证意义不大,因为这两种情况解决方案都只有一个),此时就需要考虑为安卓环境交叉编译一个第三方库了,也就是.a文件就是.o文件的聚合,具体的函数实现,静态库文件,而.h文件只是函数的声明文件,也可以是函数的接口

4)解决方法

在为第三方库进行交叉编译后,往往会产生.so和.a,等静态库和动态库,我们在为安卓编译的时候,主要是提供静态的可执行文件,所以只需要.a就好了

如何在android手机运行clang交叉编译的test_linux_03

例如这个已经编译好的,libaio.a和libaio.h,此时交叉编译时既需要用到头文件,也需要这个静态库文件,但是在makefile中一般是不会有第三方库的,你就需要把这个路径告诉makefile,让其链接,所以我们要带上-L。告诉库的路径在哪里。

但是如果要链接第三方的库,必须去指明库的名称(注意去掉前缀和后缀!)!!!也就是说,一定要告知路径下哪一个库,即使只有一个库,也要明确告知gcc要链接哪一个库(虽然我们以前写代码的时候,从来没有指明过库名称,这是因为gcc/g++默认帮我们填了,可以识别C/C++自带的库。自己写的要指明):

如何在android手机运行clang交叉编译的test_c++_04

-I:指明头文件的搜索路径 -L:指明库文件的搜索路径 -l:指明要链接哪个库,带上库的名称(去掉前缀和后缀)
我这里只指明了库文件的搜索路径和指明要链接哪个库,是因为我提前把头文件放入了交叉编译环境中,这里也体现了可以指定对应的第三方库路径,只需要把.a的静态库文件以及.h的头文件放入交叉编译环境中对应的头文件路径和静态库路径里面,那么在makefile进行编译的时候就不用再指定了
关于静态库和动态库,以及第三方库的构建如果有不懂的地方可以看这个