1.为什么要有交叉编译器?
\qquad一般电脑是X86架构,而单片机一般不是,比如单片机是ARM架构,那么gcc编译生成的程序只能在X86的架构上运行,而不能在ARM架构上运行,所以需要交叉编译器编译生成能在ARM架构上运行的程序。
\qquad查看一个可执行程序,究竟属于哪个架构,可以使用file命令。比如有.c文件hello.c。
gcc hello.c -o hello #生成可执行文件hello
file hello
\qquad运行结果:
hello: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=bf1698069c3282a51cf380a29c30a8a9062e270e, for GNU/Linux 3.2.0, not stripped
2.安装交叉工具链
\qquad安装过程很简单,就是解压缩的过程。
\qquad第一步:解压到linux标准目录,一般解压到/usr/local/arm/
下面。
\qquad第二步:添加环境变量:编辑/etc/environment
,然后添加把交叉工具链的bin
目录的绝对路径,注意一定要在原PATH中添加,不要另外起一行
,然后source
;如果要是使用时,采用绝对路径,可以不用第二步添加环境变量。
sudo vim /etc/environment
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/arm/gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabi/bin"
source /etc/environment
3.使用
\qquad 3.1使用的简单方式,需要添加环境变量。当时当有多个编译器时,可能会出现问题
arm-linux-gnueabi-gcc hello.c -o hello
\qquad 3.2 使用绝对路径方法,使用比较复杂,但是准确
/usr/local/arm/gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi-gcc hello.c -o hello
4.添加32位lib
\qquad交叉编译器是在32位系统上制作的,所以需要用到32位的lib;如果我们的linux系统是64位的,可以有时候会出现无法找到交叉编译器命令的问题,这个问题有可能是使用简单交叉编译器命令而没有添加环境变量,也有可能是没有添加32位的lib。下面介绍如何添加32位lib。
\qquadUbuntu12.04以前的版本:sudo apt-get install ia32-libs
\qquadubuntu12.04以后的版本:sudo apt-get install libc6:i386
sudo apt-get install lib32z1
5.查看交叉编译器版本和使用
\qquad查看版本:arm-linux-gnueabi-gcc -v
\qquad目录下有一个hello.c文件,我们使用交叉编译器编译,然后使用file命令查看,程序运行的架构。
arm-linux-gnueabi-gcc hello.c -o hello #编译
file hello
\qquad运行结果:hello: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux2.6.32,BuildID[sha1]=20ab9e34b81a80b48ed4a048a4db4bb2d09378e2, with debug_info, not stripped