简单了解交叉编译器
所谓的交叉编译,就是在宿主机平台上使用某种特定的交叉编译器,为某种与宿主机不同平台的目标系统编译程序,得到的程序在目标系统上运行而非在宿主机本地运行。这里的平台包含两层含义:一是核心处理器的架构,二是所运行的系统。这样,
交叉编译有 3 种情形:
1.
arm-none-eabi-gcc
表示目标处理器是ARM,不运行操作系统,仅运行前后台程序
2.arm-uclinux-eabi-gcc
表示目标处理器是ARM,运行uClinux操作系统
3.arm-none-linux-gnueabi-gcc
表示目标处理器是ARM,运行Linux操作系统
4.mips-linux-gnu-gcc
表示目标处理器是MIPS,运行Linux操作系统
进行ARM Linux 开发,通常选择arm-linux-gcc交叉编译器。ARM-Linux交叉编译器可以自行从源代码编译,也可以从第三方获取。在能从第三方获取交叉编译器的情况下,请尽量采用第三方编译器而不要自行编译,一是编译过程繁琐,不能保证成功,二是就算编译成功,也不能保证交叉编译器的稳定性,编译器的不稳定性会对后续的开发带来无限隐患。而第三方提供的交叉编译器通常都经过比较完善的测试,确认是稳定可靠的。
安装交叉编译器
解压工具链压缩包
致远电子提供的资料中提供了gcc-4.4.4-glibc-2.11.1-multilib-1.0.tar.bz2
交叉编译工具包
使用FileZill或者WinCap工具将该工具包上传至虚拟机Ubuntu的桌面上待用
用FileZill或者WinCap工具上传文件时需要Ubuntu安装SSH服务,默认的Ubuntu是不带该服务的,安装SSH服务请移步Linux上安装使用SSH服务 进入Ubuntu操作环境,将桌面上我们刚才上传的文件解压至/opt/
目录
输入命令
1 |
~$ tar xjvf gcc-4.4.4-glibc-2.11.1-multilib-1.0_EasyARM-iMX283.tar.bz2 -C /opt/ |
进入/opt/目录我们会发现已经解压的gcc-4.4.4-glibc-2.11.1-multilib-1.0
文件夹,该文件夹目录里边还有一层目录arm-fsl-linux-gnueabi
,在此如果有强迫症的同学可以自行将内目录替换掉外目录。方法如下:
1.输入命令,先将arm-fsl-linux-gnueabi
文件夹移动至/opt/目录下
1 |
~$ sudo mv arm-fsl-linux-gnueabi/ /opt |
2.回到/opt目录,输入命令删除gcc-4.4.4-glibc-2.11.1-multilib-1.0
文件夹
1 |
~$ sudo mv arm-fsl-linux-gnueabi/ /opt |
在完成解压后,如果不设置环境变量,如果不指定交叉编译器的完整路径,系统是无法调用交叉编译器的。那么接下来我们就应该开始设置系统环境变量了
设置环境变量
如果系统只有一个交叉编译器,还是强烈推荐设置系统环境变量,毕竟每次都设置全路径,稍微显得有点麻烦。设置系统环境变量后,只需在Linux终端输入以下命令,就可以调用交叉编译器,简单方便。
1 |
~$ arm-fsl-linux-gnueabi-gcc |
全路径引用
如果不添加交叉编译器的路径到系统环境变量中,则必须在每次使用交叉编译器 的地方写明交叉编译器的全路径,例如:
1 |
~$ export CC=/opt/arm-fsl-linux-gnueabi/bin/arm-fsl-linux-gnueabimake |
临时设置
临时设置系统环境变量,是通过export
命令,将交叉编译器的路径添加到系统 PATH 环境变量中。用法(多个值之间用冒号隔开),例如:
export PATH=$PATH:/交叉编译器路径
我们的路径
export PATH=$PATH:/opt/arm-fsl-linux-gnueabi/bin
然后执行echo命令,查看系统PATH
的值:
1 |
~$ echo $PATH |
这种方法设置环境变量,只能对当前终端有效,关闭终端再次打开将会失效,需要重新设置。
修改全局配置文件
在终端中添加环境变量,需要每次打开终端都设置,也很麻烦。可以考虑将设置的过程添加到系统配置文件中。“/etc/profile”
是全局配置文件,会影响登录本机的全部用户,在该文件中设置交叉编译器的路径,能够让登录本机的全部用户都可以使用这个编译器。
输入命令
1 |
~$ sudo vi /etc/profile |
在文尾添加
export PATH=$PATH:/opt/arm-fsl-linux-gnueabi/bin
此时若是新装的Ubuntu会发现VI模式下上下左右键不能正常使用,这个问题的解决方法请移步解决Ubuntu下vi不能正常使用的问题
然后在终端输入“. /etc/profile”
(点+空格+文件名),执行profile
文件,使刚才的改动生效。如果没有书写错误,此时打开终端,输入
1 |
~$ arm-fsl-linux-gnueabi- |
然后按键盘TAB
键,同样可以看到很多arm-fsl-linux-gnueabi-
开头的命令。
修改用户配置文件(推荐)
推荐大家使用修改用户配置文件的方法设置环境变量。
如果不希望影响其他用户,也可以只修改当前用户的配置文件,通常是“~/.bashrc”
或者“~/.bash_profile
”。修改方法与修改“/etc/profile”
类似,这时无需 sudo,直接 vi 打开即可,在文件末尾增加:
export PATH=$PATH:/opt/arm-fsl-linux-gnueabi/bin
此路径就是刚才解压交叉编译器的路径
保存文件并退出。
与执行“/etc/profile”
的方式一样,输入“. .bashrc”
或者“. .bash_profile”
,执行修改过的文件,使修改生效。如果无误,打开终端,输入
1 |
~$ arm-fsl-linux-gnueabi- |
然后按键盘 TAB
键,同样可以看到很多arm-fsl-linux-gnueabi-
开头的命令。进一步测试,可以编写一个简单的c文件,用交叉编译器交叉编译,并查看编译结果。 在用户目录,也就是“~”
目录下创建test.c
文件。
输入命令
1 |
~$ vi test.c |
输入以下测试程序
1 |
|
保存并关闭test.c
文件,输入以下命令
1 |
~$ arm-fsl-linux-gnueabi-gcc test.c -o hello |
再执行命令:
1 |
~$ file test |
对test.c
进行编译并查看编译后生成文件的属性:
可以看到 test 程序是 32 位 ARM 指令架构的程序
安装 32 位的兼容库
如果前面的操作都能得到正确现象,那么就该为自己庆祝一下了,因为交叉编译器已经安装完毕,并且能够正确工作了。但是事情总有例外,很有可能在终端输入命令
1 |
~$ arm-fsl-linux-gnueabi-gcc |
得到的却是下面的结果:
-bash: ./arm-fsl-linux-gnueabi-gcc: 没有那个文件或目录
此时请确认:
1.在某个目录下确实存在 arm-fsl-linux-gnueabi-gcc 文件;
2.在终端输入 arm-fsl-linux-gnueabi-,按 TAB 键,能找到 arm-fsl-linux-gnueabi-*系列命令。如果这两个条件都确认无误,那么问题就好解决了。这种问题主要发生在 64 位操作系统上,原因在于大多数交叉编译器为了适应性,通常以 32 位发布,而实际系统是 64 位的,存在架构差异,所以不能执行。解决办法很简单,安装 32 位兼容库就好了。在 Ubuntu 16.04 上的安装命令:
1 |
~$ apt-get install lib32ncurses5 |
32 兼容库需要从Ubuntu 的源下载,所以此时主机系统应当能访问互联网。
安装32位兼容库后,再次执行命令
1 |
~$ arm-fsl-linux-gnueabi-gcc |
应该得到如下信息:
arm-fsl-linux-gnueabi-gcc: no input files