Ubuntu 交叉编译工具链安装
1 交叉编译器安装
ARM 裸机、Uboot 移植、Linux 移植这些都需要在 Ubuntu 下进行编译,编译就需要编译器,我们在第三章“Linux C 编程入门”里面已经讲解了如何在 Liux 进行 C 语言开发,里面使用 GCC 编译器进行代码编译,但是 Ubuntu 自带的 gcc 编译器是针对 X86 架构的!而我们现在要编译的是 ARM 架构的代码,所以我们需要一个在 X86 架构的 PC 上运行,可以编译 ARM 架构代码的 GCC 编译器,这个编译器就叫做交叉编译器,总结一下交叉编译器就是:
1、它肯定是一个 GCC 编译器。
2、这个 GCC 编译器是运行在 X86 架构的 PC 上的。
3、这个 GCC 编译器是编译 ARM 架构代码的,也就是编译出来的可执行文件是在 ARM 芯片上运行的。
交叉编译器中“交叉”的意思就是在一个架构上编译另外一个架构的代码,相当于两种架构“交叉”起来了。
交叉编译器有很多种,我们使用 Linaro 出品的交叉编译器,Linaro 是一间非营利性质的开放源代码软件工程公司,Linaro 开发了很多软件,最著名的就是 Linaro GCC 编译工具链(编译器),关于 Linaro 详细的介绍可以到 Linaro 官网查阅。Linaro GCC 编译器下载地址如下:
/components/toolchain/binaries/latest-7/arm-linux-gnueabihf/,打开以后下载界面如图 4.3.1.1 所示:
在图中有很多种 GCC 交叉编译工具链,因为我所使用的 I.MX6U-ALPHA 开发板是一个 Cortex-A7 内核的开发板,因此选择 arm-linux-gnueabihf,点击后面的“Binaries”进入可执行文件下载界面,如下图所示
在写本教程的时候最新的编译器版本是 7.3.1,但是笔者在测试 7.3.1 版本编译器的时候发现编译完成后的 uboot 无法运行。所以这里不推荐使用最新版的编译器。笔者测试过 4.9 版本的编 译 器 可 以 正 常 工 作 , 所 以 我 们 需 要 下 载 4.9 版 本 的 编 译 器 , 下 载 地 址 为 :
/components/toolchain/binaries/4.9-.01/arm-linux-gnueabihf/ , 如下图所示:
图中有很多种交叉编译器,我们只需要关注这两种: gcc-linaro-4.9.4-.01-i686_arm-linux-gnueabihf.tar.tar.xz 和 gcc-linaro-4.9.4-.01-x86_64_arm-linux-gnueabihf.tar.xz,
第一个是针对 32 位系统的,第二个是针对 64 位系统的。大家根据自己所使用的 Ubuntu 系统类型选择合适的版本,比如我安装的 Ubuntu 16.04 是 64 位系统,因此我要使用 gcc-linaro-4.9.4-.01-x86_64_arm-linux-gnueabihf.tar.xz。
我们要先将交叉编译工具拷贝到 Ubuntu 中,我们在当前用户根目录下创
建了一个名为“linux”的文件夹,在这个 linux 文件夹里面再创建一个名为“tool”的文件夹,用来存放一些开发工具。使用前面已经安装好的 FileZilla 将交叉编译器拷贝到 Ubuntu 中刚刚新建的“tool”文件夹中,操作如图所示:
拷贝完成的话 FileZilla 会有提示,如图:
图 4.3.1.5 交叉编译器拷贝完成
在 Ubuntu 中创建目录:/usr/local/arm,命令如下:
sudo mkdir /usr/local/arm
创建完成以后将刚刚拷贝的交叉编译器复制到/usr/local/arm 这个目录中,在终端使用命令
“ cd ” 进 入 到 存 放 有 交 叉 编 译 器 的 目 录 , 比 如 我 前 面 将 交 叉 编 译 器 拷 贝 到 了 目 录
“/home/zuozhongkai/linux/tool”中,然后使用如下命令将交叉编译器复制到/usr/local/arm 中:
sudo cp gcc-linaro-4.9.4-.01-x86_64_arm-linux-gnueabihf.tar.xz /usr/local/arm/ -f
操作步骤如图所示:
图拷贝交叉编译工具到/usr/local/arm 目录中
拷贝完成以后在/usr/local/arm 目录中对交叉编译工具进行解压,解压命令如下:
sudo tar -vxf gcc-linaro-4.9.4-.01-x86_64_arm-linux-gnueabihf.tar.xz
等待解压完成,解压完成以后会生成一个名为“gcc-linaro-4.9.4-.01-x86_64_arm-linuxgnueabihf”的文件夹,这个文件夹里面就是我们的交叉编译工具链。
修改环境变量,使用 VI 打开/etc/profile 文件,命令如下:
sudo vi /etc/profile
打开/etc/profile 以后,在最后面输入如下所示内容:
export PATH=$PATH:/usr/local/arm/gcc-linaro-4.9.4-.01-x86_64_arm-linux-gnueabihf/bin
添加完成以后的/etc/profile 如图 4.3.1.7 所示:
图 4.3.1.7 添加环境变量
修改好以后就保存退出,重启 Ubuntu 系统,交叉编译工具链(编译器)就安装成功了。
4.3.2 安装相关库
在使用交叉编译器之前还需要安装一下其它的库,命令如下:
sudo apt-get install lsb-core lib32stdc++6
等待这些库安装完成。
4.3.3 交叉编译器验证
首先查看一下交叉编译工具的版本号,输入如下命令:
arm-linux-gnueabihf-gcc -v
如果交叉编译器安装正确的话就会显示版本号,如图 4.3.3.1 所示:
图 4.3.3.1 交叉编译器版本查询
从图 4.3.3.1 中可以看出当前交叉编译器的版本号为 4.9.4,说明交叉编译工具链安装成功。
第三章“Linux C 编程入门”中使用 Ubuntu 自带的 GCC 编译器,我们用的是命令“gcc”。要使
用刚刚安装的交叉编译器的时候使用的命令是“arm-linux-gnueabihf-gcc”,“arm-linux-gnueabihfgcc”的含义如下:
1、arm 表示这是编译 arm 架构代码的编译器。
2、linux 表示运行在 linux 环境下。
3、gnueabihf 表示嵌入式二进制接口。
4、gcc 表示是 gcc 工具。
最好的验证方法就是直接编译一个例程,我们就编译第一个裸机例程“1_leds”试试,裸机
例程在开发板光盘中的路径为:1、程序源码->1、裸机例程-> 1_leds。在前面创建的 linux 文件
夹下创建 driver/board_driver 文件夹,用来存放裸机例程,如图 4.3.3.2 所示:
图 4.3.3.2 创建 board_driver 文件夹
将第一个裸机例程“1_leds”拷贝到 board_driver 中,然后执行 make 命令进行编译,如图
4.3.3.3 所示:
图 4.3.3.3 编译过程
从图 4.3.3.3 可以看到例程“1_leds”编译成功了,编译生成了 led.o 和 led.bin 这两个文件,
使用如下命令查看 led.o 文件信息:
file led.o
结果如图 4.3.3.4 所示:
图 4.3.3.4 led.o 文件信息
从图 4.3.3.4 可以看到 led.o 是 32 位 LSB 的 ELF 格式文件,目标机架构为 ARM,说明我
们的交叉编译器工作正常。