交叉编译器简介
首先要与您分享的是中的交叉编译工具集,如下图所示:
如图,比如CPU需要添加,那么显然x86可以想到“添加1010”。如果看到这样的组合,我觉得CPU需要补充。所以自然,我们程序员只要给CPU写个高低分,CPU基本就能做加法了。所以这个想法和我们之前学习汇编很像,但是我们现在不一样,因为我们的PC一般都是x86。但是如果把我们现在的CPU换成ARM,那么1010对于ARM来说是不一样的,因为是两个不同的公司,那么在这样一个指定的级别上进行编解码,会有不同的结果吗?比如arm中的1010可能不是加法,可能是mov的移动指令。然后你会发现,如果我们在x86上编译一个二进制集合包或者二进制程序集合,不做任何修改就放在arm板上,那么就会出现一个新的问题,就是我们的arm不知道这样的集合,也就是说和你自己添加的逻辑不一致。
所以我们渴望在x86上编译一个arm可以理解的逻辑。也就是说,这种情况变成下图:
如图所示,我们的x86是我们的主机和目标机,也就是我们刚开始学习应用开发的时候,我们的主机是x86,然后我们的目标机是x86,因为我们运行的是x86上运行的进程或者网络编程的概念。但是我们现在的嵌入式开发不一样了。我们的主机没有换成x86,但是我们的目标机现在变成了ARM CPU。
所以这样,正常情况下,主机和目标机是同一个品牌。但是到现在,我们变成了主机,变成了平台,目标机就是另一个平台,所以这种情况叫跨界。
也就是说,在这种情况下,我们需要一个交叉编译器来完成从一个结构编译到另一个结构的编译器。如果目标机器和主机在同一个平台上,我们会称之为同一个编译器,比如我们最典型的gcc。这就是为什么我们首先有了交叉编译器的概念。在这个概念中,我们将介绍一个名为file command的命令。通过这个命令,我们将加深为什么在未来的编译和开发过程中可能会遇到新的问题。也就是说我们都知道一个Linux系统的可执行程序是没有后缀的,也就是我们不会写ese或者。xx喜欢Windows让大家分辨。很有可能我们最后的可执行程序叫做build,所以这种情况下经常会发生。如果我在实际开发中不小心把x86下编译的build烧在arm板上,运行久了跑不出去,甚至整个程序的逻辑都乱了。
原来的原因是有时候我们不小心把x86程序放到了arm板上,那么应该如何避免这样的情况呢?
如图所示,我们仍然使用1.c和一个非常简单的hello world作为例子。然后我们用gcc -o build 1.c生成一个build程序,然后点击ls看到这个build没有后缀名,也没有其他logo。我怎么知道它是在x86还是arm下运行,或者换句话说,这个程序能在我的板上运行吗?然后我们会看第一个命令叫做文件构建,然后点击回车键,你会发现上面有很多东西。一般这些都不需要我们去关心,唯一需要关心的是“x86-64”。因为我的机器是64位的,所以你会发现在查看build的真实属性的第二个选项中,它会告诉我们Build工作的平台是x86认可的,这是一个从File中读取其头的消息。
交叉编译结果
我们来看看如果有交叉编译器,交叉编译的结果会是什么样子。之前我们讲过跨编译器,也说过一般有两种方法:第一种是直接编译,第二种是手工编译。今天,我们仍然使用芯片制造商汇编的内容。
其实在Linux系统上安装软件是比较简单的,不是以双击的形式,而是实际上是一个解包的过程,主要是把工具集解压到一个目录,然后我们就可以直接使用了。
然后我们来看看如何安装交叉编译器:
安装一个交叉编译器其实很简单,就是一个解压的过程。在解压过程中,解压到linux标准目录。在安装过程中,我们会直接将交叉编译器复制到您在Windows目录下的共享目录中。
如图,安装命令为“tar-zxvf arm-Linux-qcc-4 . 5 . 1-VFP-20120301 . tgz”。请注意,上面一行命令中的tgz实际上是一个缩写,所以使用zcvf。然后记住你不用解包直接输入这个包,因为我们知道这个包默认是Windows的共享目录。因此,一旦发生回车,编译器中的一些工具就可能无法使用。最典型的工具就是软连接。因为Windows中没有软链接的概念,所以很有可能这个包中如果有软链接文件,解压缩了就不支持了,最后可能报错或者占用大量数据。所以我们建议你尽量不要安装在Windows的共享目录下,而是尽量安装在Linux本身虚拟机的硬盘目录下。因此,我们在切换到另一个目录时需要“-C”。一般来说,交叉编译器在制作的时候会为你打包整个目录,所以在写的时候,我们习惯直接解压根目录。传递根相当于将解压缩权限直接授予交叉编译器,然后单击回车键:
如图,你会发现这个地方有些问题。“文件已经存在”的原因是我刚才键入命令的时候没有使用超级用户,所以我们在命令“tar-zxvf arm-Linux-QCC-4 . 5 . 1-VFP-20120301 . tgz-c/”前面加一个sudo并没有错。然后我们解压。在解压的过程中,一般来说没有太大问题。您可以仔细查看它是否报告了任何错误。如果它没有报告任何错误,您可以这样做。
解压后:
如图,我们进入opt目录后,因为opt本身就有一个目录,所以可以逐级进入。最后,进入4.5.1目录后,我们会发现这个目录中的选项其实是交叉编译器中的保护伞安装包,对我们写目录很有帮助。
比如目录“bin”就相当于交叉编译器中的命令集,也就是说我们的命令基本上都应该在bin中找到。“lib”有两种形式。第一种形式是我们的交叉编译器在运行时有一个库。第二种是我们希望交叉编译器在x86上运行,但是我们想编译成arm,所以在编译过程中涉及到两种库,一种是x86库,一种是arm库。
也就是说,我们的交叉编译器本身就是软件,它运行在一个需要x86的平台上,所以这个时候它必须有一个x86库来为它的运行做准备,但是它的最终目标还是要看arm系统。因此,链接时需要提供arm库。
如图,我们进bin看看。你会发现这个地方有很多文件。当然,虽然文件很多,但是你可以发现有一个统一的规则。当然这个地方会先从一个想法开始,就是说我们安装一个整块叫做交叉编译集或者交叉编译链,也就是说我们不仅需要用到一个叫做gcc的东西,还可以看到gcc之外还有很多其他的命令,其实就是我们后面要介绍给大家的叫做工具集的功能,所以我们实际安装交叉编译器是为了安装一套工具,而不仅仅是gcc。然后输入如图所示的命令,实际上是一个L文件,而L文件是软链接到本地目录下的文件,所以这个命名规则和我们之前讲的交叉编译器规则很像,就是“arm-none-linux-gnueabi-gcc”,这是一个在linux下有新的标准接口的gcc工具。一般来说,这个名字写起来太长了,我们可以在这里用软链接链接,只需键入“arm-linux-gcc”,所以这是我们常用的方式。
那么我们安装的第一步就是解压。一般来说,要把它解压到linux标准目录下,下一步就是我们的两个使用方法。
使用
1.使用一个简单方法
#arm-linux-gcc -o build 1.c
简单方法的优缺点:只需几个字符就可以工作,但也有很多缺点。比如你的系统不仅是这个品牌开发的,其他品牌也有。这种情况下,你很可能不知道用这个快捷方式找的是哪一个,所以可能会导致编译中出现一些奇怪的问题。因为你的编译器错了,很有可能你的新编译器不知道或者旧编译器不支持,所以这个方法一定要谨慎使用,就是你的系统不能有多个编译器。
2.使用绝对路径法
#/opt/FriendYarm/toolschain/4 . 5 . 1/bin/arm-Linux-gcc-o build 1 . c
绝对路径的优缺点:它的缺点是相对于简单路径过于复杂,但我个人更喜欢使用绝对路径。虽然很麻烦,但是不需要每次都输入,而且这个方法绝对可以保证你用的编译器是正确的。
1.《交叉编译 嵌入式系统移植中的交叉编译器详解》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《交叉编译 嵌入式系统移植中的交叉编译器详解》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/junshi/1797871.html