【交叉编译】什么是交叉编译,为何要有交叉编译?

一、交叉编译简介

1、什么是交叉编译

1.1 本地编译

解释什么是交叉编译之前,先要明白一个概念:本地编译

我们之前常见的软件开发,都是属于本地编译:在当前的PC下,x86的CPU下,直接编译出来程序,可以运行的程序(或者库文件),其可以直接在当前的环境,即x86的CPU下,当前电脑中,运行。

此时的编译,可以叫做:本地编译,即在当前目标平台下,编译出来的程序,也只是放到当前平台下,就可以运行的。

1.2 交叉编译

交叉编译,是一个和,本地编译,相对应的概念。

而所谓的,交叉编译,就是:在一种平台上编译,编译出来的程序,是放到别的平台上运行即编译的环境,和运行的环境不一样,属于交叉的,此所谓 cross

交叉编译,这个概念,主要和嵌入式开发有关。

例 如.:在x86平台上编译,在ARM平台上运行。

一种最常见的例子就是:

在进行嵌入式开发时手上有个嵌入式开发板,CPU是arm的然后在x86的平台下开发,比如Ubuntu的Linux,或者是Win 10然后就需要:

在x86的平台上,(用交叉编译器)去编译你写好的程序代码

编译生成的(可执行的)程序,是放到目标开发板,arm的CPU上运行的

此所谓:在x86平台上编译,在ARM平台上运行。

交叉编译,英文常写作cross compile,也有其他写法:crosscompile, cross compiling 等。

2、为何要有交叉编译

之所以要有交叉编译,主要原因是:嵌入式系统中的资源太少

具体的解释就是:交叉编译出来的程序,所要运行的目标环境中,各种资源,都相对有限,所以很难进行直接的本地编译。

最常见的情况是:在进行嵌入式开发时,目标平台,即嵌入式开发板,比如是最大主频200MHz的ARM的CPU,加上32M的RAM,加上1G的Nand Flash等等。在如此相对比较紧张的硬件资源的前提下,在已经运行了嵌入式Linux的前提下,是没法很方便的直接在嵌入式Linux下,去本地编译,去在ARM的CPU下,编译出来,供ARM的CPU可以运行的程序的。因为编译,开发,都需要相对比较多的CPU,内存,硬盘等资源,而嵌入式开发上的那点资源,只够嵌入式(Linux)系统运行的,没太多剩余的资源,供你本地编译。

BusyBox中包含make等和编译开发相关的工具

对应的,等你后期熟悉了嵌入式开发,熟悉了Busybox后,比如在Buildroot中去配置Busybox,或者单独交叉编译BusyBox时:

【记录】Ubuntu下为QEMU的arm平台交叉编译BusyBox

就会看到,后来的BusyBox,功能增加后,也已经包含了一些,和编译开发相关的工具,比如make等等

而这些工具,本来的话,只是,放在PC端使用,即在x86平台下做开发的时候,在交叉编译的时候,才用到的工具,现在,也在(BusyBox的)嵌入式环境中,支持了。

此时,如果,你在BusyBox中把相关的开发工具都选上的话,

再加上,你的目标开发板的硬件配置足够强大的话,比如CPU都是以GHz为单位,等等

加上相关的开发的库和工具都很全的话

实际上,至少理论上,也是可以在你的嵌入式Linux中,进行,有限的,甚至是很大程度上的,本地开发即,直接在ARM的开发板上,嵌入式Linux中,直接进行嵌入式开发,进行针对ARM的本地编译

比如,编译出一个helloworld,估计还是可以的。

这样,就不存在,或者说,避免了,此处所说的,交叉编译,而变成了本地编译

就相当于,之前在x86的PC端的,编译程序放在x86的CPU上运行的本地编译,

在ARM的CPU,嵌入式Linux中,也实现了

但是很明显,对于更加复杂的程序或者库,在ARM开发板上直接编译的可行性和效率,相对就很低

而且如果是本身折腾Uboot等东西,本身目标运行环境,就没有完整的(嵌入式Linux)系统的话,那么就更加没法在目标平台实现本地编译了。

则还是只能进行,此处所说的,交叉编译

二、交叉工具链简介

1、什么是工具链

所谓的工具链,两部分的含义:

a – 工具

工具,即tool

工具,是用来干活的;此处要干的活,目标是为了:生成(可以运行的)程序或库文件

而为了达成此目标,内部的执行过程和逻辑主要包含了:

1)、编译

编译的输入(对象)是:程序代码

编译输出(目标)是:目标文件

编译所需要的工具是:编译器

编译器,常见的编译器,即为gcc

2)、链接

链接的输入(对象)是:(程序运行时所依赖的,或者某个库所依赖的另外一个)库(文件)

链接的输出(目标)是:程序的可执行文件,或者是可以被别人调用的完整的库文件

链接所需要的工具是:链接器

链接器,即ld

即,此处,为了将程序代码,编译成可执行文件,涉及到编译,链接(等其他步骤),要依赖到很多相关的工具,最核心的是编译器gcc,链接器ld。而此处,所谓的工具,主要指的就是:和程序编译链接等相关的gccld等工具

binutils包含了ld等工具

实际上,上面所说的ld,只是处理操作目标文件,二进制文件的最主要的一个工具

而和操作目标等文件相关的,还有其他很多工具的:as,objcopy,strip,ar等等工具的。

所以,对此,GNU官网,弄出一个binutils,即binary utils,二进制工具(包),集成了这些,和操作二进制相关的工具集合,叫做binutils

所以,之后你所见到的,常见的工具,就是那个著名的GNU Binutils了。

b – 链

链,即链条,chain

之所以能称为链,你是说明不止一个东西,然后,按照对应的逻辑,串在一起,链在一起。而对应的,涉及到的:

不止一个东西:指的是就是前面所说的那个工具,即:和程序编译链接等相关的gcc,binutils等工具。

按照对应的逻辑:指的就是,按照程序本身编译链接的先后顺序,即:先编译,后链接,再进行后期其他的处理等等,比如用objcopy去操作相应的目标文件等等。

如此的,将:

和程序编译链接等相关的gcc,binutils等工具按照先编译后链接等相关的编译程序的内在逻辑串起来,就成了我们所说的:工具链

2、什么是交叉工具链

普通所说的,工具链指的是当前自己的本地平台的工具链。

用于交叉编译的工具链,就叫做交叉工具链。即那些工具,即编译的gcc,链接的ld,以及相关的工具,用于交叉编译的,工具链,叫做交叉工具链。

交叉工具链,很明显,是用来,交叉编译,跨平台的程序所用的。交叉工具链,和(本地)工具链类似,也是包含了很多的,对应的工具,交叉编译版本的gcc,ld,as等等。但是,由于其中最最主要的是用于编译的gcc,所以,我们也常把:交叉工具链,简称为交叉编译器。

即严格意义上来说,交叉编译器,只是指的是交叉编译版本的gcc。但是实际上为了叫法上的方便,我们常说的交叉编译器,都是指的是交叉工具链。常说的交叉编译版本的gcc,比如arm-linux-gcc,实际上指代了,包含一系列交叉编译版本的交叉工具链(arm-linux-gccarm-linux-ldarm-linux-as等等)而此文中,后面,所说的,如无特殊指明,均用交叉编译器指代交叉工具链。

总结

交叉编译就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程序,比如在PC平台(X86 CPU)上编译出能运行在以ARM为内核的CPU平台上的程序,编译得到的程序在X86 CPU平台上是不能运行的,必须放到ARM CPU平台上才能运行,虽然两个平台用的都是Linux系统。 交叉编译工具链是一个由编译器、连接器和解释器组成的综合开发环境,交叉编译工具链主要由 binutilsgccglibc 三个部分组成。有时出于减小 libc 库大小的考虑,也可以用别的 c 库来代替 glibc,例如:uClibc、dietlibc 和 newlib。

  • 12
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
交叉编译是指在某种开发环境下,将程序代码编译成可在不同类型或构架的操作系统或平台上运行的可执行程序。sysbench是一个在数据库和操作系统上进行基准测试和性能评估的工具。要交叉编译sysbench,首先需要选择目标平台的交叉编译工具链,这通常包括交叉编译器、交叉链接器和交叉调试器。接着需要配置sysbench的编译选项,指定目标平台的操作系统和构架。然后进行交叉编译,根据不同的目标平台和编译工具链,具体的步骤可能会有所不同。最后,进行测试和部署,验证交叉编译后的sysbench在目标平台上能够正常运行并得到期望的性能数据。 具体来说,首先需要获取目标平台的交叉编译工具链,可以通过在官方网站下载或自行编译获取。接着需要配置sysbench的编译选项,包括指定交叉编译器、交叉链接器等工具,以及目标平台的操作系统和构架。然后执行编译命令,根据具体的编译工具链和选项进行交叉编译。最后,在目标平台上进行测试,验证交叉编译后的sysbench在该平台上的性能表现和稳定性。如果有必要,还可以进行调试和优化,以确保sysbench在目标平台上能够达到最佳的性能和稳定性。 总之,交叉编译sysbench需要选择合适的交叉编译工具链,配置编译选项,进行编译和测试,并根据需要进行调试和优化,以确保sysbench在目标平台上能够正常运行并得到准确的性能数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Cappuccino-jay

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

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

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

打赏作者

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

抵扣说明:

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

余额充值