赞
踩
交叉编译这个概念的出现和流行是和嵌入式系统的广泛发展同步的。我们常用的计算机软件,都需要通过编译的方式,把使用高级计算机语言编写的代码(比如C代码)编译(compile)成计算机可以识别和执行的二进制代码。比如,我们在Windows平台上,可使用Visual C++开发环境,编写程序并编译成可执行程序。这种方式下,我们使用PC平台上的Windows工具开发针对Windows本身的可执行程序,这种编译过程称为native compilation,中文可理解为本机编译。然而,在进行嵌入式系统的开发时,运行程序的目标平台通常具有有限的存储空间和运算能力,比如常见的ARM平台,其一般的静态存储空间大概是16到32MB,而CPU的主频大概在100MHz到500MHz之间。这种情况下,在ARM平台上进行本机编译就不太可能了,这是因为一般的编译工具链(compilation tool chain)需要很大的存储空间,并需要很强的CPU运算能力。为了解决这个问题,交叉编译工具就应运而生了。通过交叉编译工具,我们就可以在CPU能力很强、存储空间足够的主机平台上(比如PC上)编译出针对其他平台的可执行程序。
出处 : https://baike.baidu.com/item/%E4%BA%A4%E5%8F%89%E7%BC%96%E8%AF%9
在进行环境搭建前,需要首先获取ARM交叉编译工具 。可以选择自行获取源码从源码编译相关文件,也可以使用网络上提供的现成文件。从源码编译是一件繁琐并且相当耗时的事,所以一般会选择使用芯片或开发板厂家提供的现成的ARM交叉编译工具 。
如果希望自己根据实际芯片平台制作ARM交叉编译器,可以使用crosstool工具自行制作,以下提供一篇别人写的教程:https://blog.csdn.net/lhw88117/article/details/7183896,不保证完全正确,毕竟笔者也没试过,等笔者有空可以自己尝试编译一次写一篇博客。也可以考虑使用crosstool_ng,听说更好用,参考文章可以看看这个:https://blog.csdn.net/c1194758555/article/details/59112263
获取到工具链的压缩包然后上传到linux。 这里笔者准备了 arm-2014.05-29-arm-none-linux-gnueabi.src.tar.bz2 ,以下均以此为基础安装编译环境。
使用cd命令进入压缩包所在目录,解压压缩包,以下命令解压压缩包内文件到当前目录下:
- #解压文件
- tar -xf arm-2014.05-29-arm-none-linux-gnueabi.src.tar.bz2
进入解压后的目录,这里笔者解压后的目录为 arm-2014.05 ,其下有一个bin目录,其中为ARM交叉编译工具的各个可执行文件。进入bin目录并执行以下命令打印编译器版本信息,如果正常打印,则表示编译器运行正常。
- #打印版本信息,具体的执行文件名称可能因为版本原因有所不同
- ./arm-none-linux-gnueabi-gcc -v
执行命令后会在打印信息的末尾显示版本信息,笔者打印信息如下: gcc version 4.8.3 20140320 (prerelease) (Sourcery CodeBench Lite 2014.05-29)
有些版本的编译器可能会因为缺少32运行库导致运行失败,通过以下命令可以安装32位运行库,失败时可以尝试一下。只适用于Centos7,最新的Centos8会提示找不到xulrunner.i686,估计是官方不再提供支持了 = =。
- #安装32位运行环境
- sudo yum install xulrunner.i686
- #顺带把32位的glib库支持安装了,经常用
- sudo yum -y install glibc-devel.i686 glibc-devel
配置PATH环境变量可以告诉shell当我们需要执行一条命令时,可以去哪里找这条命令,这样我们要调用编译器时就不用每次都进入编译器所在目录。以下提供一种PATH环境变量的配置方法:
- #使用以下命令可以查看当前的PATH环境变量内容
- echo $PATH
- #之后命令需要安装文本编辑器,这里以安装nano为例,已有编辑器的无视我
- sudo yum install nano
- #修改home目录下的.bashrc文件来配置环境变量,此操作只对目前用户生效
- nano ~/.bashrc
打开.bashrc文件后,在其末尾添加一条语句:export PATH=/home/water/arm-2014.05/bin:$PATH
其中 /home/water/arm-2014.05/bin 替换为实际编译器执行文件所在目录,修改完成后保存退出。
为了使修改生效,手动更新一下环境变量信息
- #更新环境变量信息
- source ~/.bashrc
- #回到home目录
- cd ~
- #现在可以在任意目录使用编译器了,试着再次打印版本信息
- arm-none-linux-gnueabi-gcc -v
更多环境变量的配置方法可以参见此博文:https://blog.csdn.net/boolbo/article/details/5243776
Linux软链接,类似于windows系统的快捷键,这里我们可以用软链接为编译器的各个执行文件起个短一点的名字方便我们调用。
- #进入编译器执行文件所在目录,这里为/home/water/arm-2014.05/bin
- cd /home/water/arm-2014.05/bin
- #为arm-none-linux-gnueabi-gcc设置名为arm-linux-gcc的软连接
- ln arm-none-linux-gnueabi-gcc arm-linux-gcc
- #为arm-none-linux-gnueabi-ld设置名为arm-linux-ld的软连接
- ln arm-none-linux-gnueabi-ld arm-linux-ld
- #为arm-none-linux-gnueabi-objcopy设置名为arm-linux-objcopy的软连接
- ln arm-none-linux-gnueabi-objcopy arm-linux-objcopy
- #为arm-none-linux-gnueabi-objdump设置名为arm-linux-objdump的软连接
- ln arm-none-linux-gnueabi-objdump arm-linux-objdump
了解更多linux下的软链接知识,可以参考此博文:https://blog.csdn.net/qq_21386275/article/details/79881543
呼,总算写完了。其实这篇博文早在半个月前就想要动笔写的,不过当时刚把交叉编译器用利索不久,很多地方自己都迷迷糊糊,再加上本人身患的拖延癌作怪,所以就拖到现在了。不过我现在动手写这篇博文,也是有把握自己能够写得不太差才开始动笔的。在写的过程中又各种各样的资料查了一遍,也是为了保证文字叙述大体的严谨性与准确性,同时为了保证可操作性,还把搭建好的编译环境全部清除了边写边重新搭建了一次。在写作过程中查阅的各种资料,也使我自己对交叉编译的了解加深了不少,所谓输出倒逼输入,无外乎如此,啊哈哈。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。