交叉编译工具链的安装以及介绍
Posted 代二毛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了交叉编译工具链的安装以及介绍相关的知识,希望对你有一定的参考价值。
什么是交叉编译工具链
在A机上写源码并将源码编译成可执行文件,然后把可执行文件烧写到B机中执行,其中把源码编译成可执行代码的工具就叫做交叉编译工具链。交叉就是在A机上编译得到可执行程序,然后在B机上执行,其中A机一般是电脑端,B机一般是设备端(比如路由器、机顶盒、智能设备)。之所以要交叉编译是因为B机性能相对于A机较弱,并且功能固定,甚至都没有操作系统,你怎么在这样的设备上写代码和编译。叫工具链是因为这是由多个编译链组成的,比如gcc(将源码编译成可执行程序)、objdump(反汇编)、objcopy(将ELF格式的可执行文件转换为二进制文件)等等。
为什么需要交叉编译工具链
假设你现在要开发一个智能设备,除了硬件你还需要编写在设备上运行的代码吧,那你的开发环境要在哪里搭建?总不能在智能设备上搭建一个开发环境吧,首先智能设备采用的芯片一般都不会是电脑级别的,不支持搭建开发环境,简单一点的设备用8位的单片机,连操作系统都没有;再者,智能设备的功能都相对单一,出厂什么功能就什么功能,选择性能匹配的芯片可以节省成本。所以我们都在PC端去搭建开发环境,如果是公司,一般是在自己的电脑编写代码,然后在编译服务器上编译得到可执行代码,再烧写到设备中。正是因为在A机编译,在B机执行,得到的可执行程序要以B机为准,A机上编译时要用和B机匹配的编译工具去编译,这就是交叉工具编译链存在的意义,因为编译和执行不再一个机器上。
交叉工具编译链的选择
选择以匹配为准,不要追求最新版本。不同平台、芯片在发布时都会说明其匹配的交叉编译工具链,必须用匹配的交叉工具编译链去编译程序,程序才能在目标机上运行。我们写的C、C++、Jave等高级语言是经过封装的,不用考虑将来代码会在哪个平台运行,只需要负责逻辑层面,只要编译的时候选择和芯片匹配的编译器或者编译工具链就可以生成在目标机器上运行的可执行代码。每款芯片的汇编指令是不同,这是芯片的特征,同样的源码用不同的编译器编译会生成不同的汇编代码,再将汇编代码转成二进制的可执行程序。
安装步骤:以安装"arm-2009q3"为例
1.将交叉工具编译链导入到Linux系统中
1.在/usr/local/下创建/usr/local/arm目录,用于存放交叉编译工具链;这个目录不是必须的,但是一般自己装的程序都放在/usr目录下,方便以后管理。
2.将交叉编译工具链的压缩包从Windows弄到linux系统的/usr/local/arm目录下,推荐使用共享文件夹;
2.解压缩
在/usr/local/arm目录里执行:tar -jxvf arm-2009q3.tar.bz2
3.测试安装是否成功
1.解压缩后在"/usr/local/arm/arm-2009q3/bin"目录下执行:./arm-none-linux-gnueabi-gcc -v
2.会看到交叉工具编译链的版本信息:gcc version 4.4.1,则代表安装成功。
4.将交叉工具编译链添加到环境变量中
1.添加到环境变量是方便操作,以后使用交叉编译工具链就不会写全路径,系统会自动去指定的目录里查找:export PATH=/usr/local/arm/arm-2009q3/bin:$PATH
2.经过步骤1后,只能在当前终端生效,关掉这个终端或者再重新开一个终端,上一步的操作就失效了。解决方案是在~/.bashrc文件中,添加export PATH=/usr/local/arm/arm-2009q3/bin:$PATH 即可。此操作的作用是,每次打开终端都会把“/usr/local/arm/arm-2009q3/bin”路径加入到环境变量中。
5.为交叉工具编译链创建符号链接
1.用ln命令创建符号链接:ln arm-none-linux-gnueabi-gcc -s arm-linux-gcc
2.效果:以后想调用"arm-none-linux-gnueabi-gcc"时可以直接输入"arm-linux-gcc"调用,使用更方便;
3.可以逐次用ln命令为每一个编译链创建链接符号,也可以写一个脚本来创建,到时候只需要把脚本放到"/usr/local/arm/arm-2009q3/bin"目录下,执行:./mk-arm-linux-.sh。最好是在linux环境中写此脚本,在Windows环境里写这个脚本再放到linux环境中执行,可能会因为Windows和linux环境中换行操作的不同导致脚本执行失败。
mk-arm-linux-.sh
ln arm-none-linux-gnueabi-addr2line -s arm-linux-addr2line
ln arm-none-linux-gnueabi-ar -s arm-linux-ar
ln arm-none-linux-gnueabi-as -s arm-linux-as
ln arm-none-linux-gnueabi-c++ -s arm-linux-c++
ln arm-none-linux-gnueabi-c++filt -s arm-linux-c++filt
ln arm-none-linux-gnueabi-cpp -s arm-linux-cpp
ln arm-none-linux-gnueabi-g++ -s arm-linux-g++
ln arm-none-linux-gnueabi-gcc -s arm-linux-gcc
ln arm-none-linux-gnueabi-gcc-4.4.1 -s arm-linux-gcc-4.4.1
ln arm-none-linux-gnueabi-gcov -s arm-linux-gcov
ln arm-none-linux-gnueabi-gdb -s arm-linux-gdb
ln arm-none-linux-gnueabi-gdbtui -s arm-linux-gdbtui
ln arm-none-linux-gnueabi-gprof -s arm-linux-gprof
ln arm-none-linux-gnueabi-ld -s arm-linux-ld
ln arm-none-linux-gnueabi-nm -s arm-linux-nm
ln arm-none-linux-gnueabi-objcopy -s arm-linux-objcopy
ln arm-none-linux-gnueabi-objdump -s arm-linux-objdump
ln arm-none-linux-gnueabi-ranlib -s arm-linux-ranlib
ln arm-none-linux-gnueabi-readelf -s arm-linux-readelf
ln arm-none-linux-gnueabi-size -s arm-linux-size
ln arm-none-linux-gnueabi-sprite -s arm-linux-sprite
ln arm-none-linux-gnueabi-strings -s arm-linux-strings
ln arm-none-linux-gnueabi-strip -s arm-linux-strip
注:此内容是学习朱有鹏老师课程的总结
以上是关于交叉编译工具链的安装以及介绍的主要内容,如果未能解决你的问题,请参考以下文章