一,何为交叉编译?
我们需要在arm芯片的板子上运行程序,该程序就需要在x86芯片上通过交叉编译的方式,编译出一个arm架构的程序。
二,如何交叉编译?
1、我们编译一个x86的程序使用的是gcc,而交叉编译则使用的是交叉编译工具链里的gcc,每家arm板子对应的工具链都不同,比如海思3716使用的arm-hisiv200-linux-gcc。
交叉编译gcc使用方法和gcc是一样的,我们可以直接编译源代码,也可以编写Makefile进行编译。
2、如何把开源的库或程序移植到arm板子上?
我们知道一般这些开源的库或程序源代码里都有configure脚本,该脚本有--build,--host,--target这三个参数,而这些就是交叉编译的关键。
三,三个参数介绍
--build:
表示目前我们正在运行的平台名称是什么,如果当前我们是在intel的pentium机器中编译该系统,那么我们的--build就可能
是i686-pc-linux-gnu,当然如果我们在其它种类的机器上编译那么这个build就应该是那个机器所对应的平台名称。
该参数在不指定的情况下将自动常识猜测目前平台的名称。
--host:
表示我们编译好的程序或库将在什么样的平台下运行,在交叉编译过程中这个需要我们来指定,我们填交叉工具链的名称。比如填arm-hisiv200-linux。
--host也可以不指定,那么host将自动使用build来定义自己,不过那将不再是交叉编译。
注:--build和--host在不同的时候就被配置文件认定为交叉编译方式。
--target:
该参数的目的是让配置程序知道这个软件被编译后使用来处理什么平台上的文件的。
target这个参数只有在为数不多的几个包中有用处,虽然在./configure --help中经常能看到该参数,但实际上绝大多数软件包都是不需要该参数的。据我说知,gdb和gdbserver如何配置使用的话,是需要这个参数的。
四、举例
那么我们举例来说,比如我要将某个开源库或程序移植到arm平台,运行configure脚本,如./configure --host=arm-hisiv200-linux --prefix=/usr/local/xx --program-prefix=xx 即可。它会自动生成Makefile脚本,该脚本会自动去找arm-hisiv200-linux-gcc交叉编译工具。--program-prefix的意思是生成的库或程序名字可增加的前缀。(可不指定)