1.交叉编译器介绍
ARM 裸机、Uboot 移植、Linux 移植这些都需要在 Ubuntu 下进行编译,编译就需要编译器,在 Liux 进行 C 语言开发里面使用 GCC 编译器进行代码编译,但是 Ubuntu 自带的 gcc 编译器是针对 X86 架构的!而我们现在要编译的是 ARM 架构的代码,所以我们需要一个在 X86 架构的 PC 上运行,可以编译 ARM 架构代码的 GCC 编译器,这个编译器就叫做交叉编译器,总结一下交叉编译器就是:
1. 它肯定是一个 GCC 编译器。
2. 这个 GCC 编译器是运行在 X86 架构的 PC 上的。
3. 这个 GCC 编译器是编译 ARM 架构代码的,也就是编译出来的可执行文件是在 ARM 芯片上运行的。
交叉编译器中“交叉”的意思就是在一个架构上编译另外一个架构的代码,相当于两种架构“交叉”起来了。交叉编译器有很多种,ST 也有推荐的通用交叉编译器,一个是 ARM 官方出品的:gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf,一个是 linaro 出品的:gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi.tar.xz,下载地址在https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/arm-linux-gnueabi/本教程我们使用 ARM 官方出品的交叉编译器。
-
首先是下载 ARM 官方出品的交叉编译器,编译器下载地址如下:https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-a/downloads,打开以后如图所示
-
在 Ubuntu 中创建目录:/usr/local/arm,
-
创建完成以后将刚刚拷贝的交叉编译器复制到/usr/local/arm 这个目录中, 进 入 到 存 放 有 交 叉 编 译 器 的 目 录 ,
-
拷贝完成以后在/usr/local/arm 目录中对交叉编译工具进行解压,解压命令如下,也可图形化节点点击解压文件:
sudo tar -vxf gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf.tar.xz -
等待解压完成,解压完成以后会生成一个名为“gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf”的文件夹,这个文件夹里面就是我们的交叉编译工具链。
-
修改环境变量,使用打开/etc/profile 文件,命令如下:
sudo vi /etc/profile -
打开/etc/profile 以后,在最后面输入如下所示内容:
export PATH=$PATH:/usr/local/arm/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/bin
添加完成以后的/etc/profile 如图所示
-
修改好以后就保存退出,重启 Ubuntu 系统,交叉编译工具链(编译器)就安装成功了。
-
在使用交叉编译器之前还需要安装一下其它的库,命令如下:
sudo apt-get update //先更新,否则安装库可能会出错
sudo apt-get install lsb-core lib32stdc++6 //安装库
等待这些库安装完成。
2.交叉编译器验证
首先查看一下交叉编译工具的版本号,输入如下命令:
arm-none-linux-gnueabihf-gcc -v
如果交叉编译器安装正确的话就会显示版本号:
3. 移植时make编译问题
例如移植nginx:使用./configure …配置好安装目录等,使用make && make install编译安装,其中make使用的编译器实际是读取变量CC和CXX文件,所以执行./configure前export CC=aarch64…-gcc等设定编译器,并且这两个gcc和g++所在bin路径在path环境变量中
使用问题
问题1执行时
-
在开发板执行时出现not found
-
在虚拟机使用编译工具中的readelf命令查看可执行文件,如使用的riscv64-unknown-linux-gnu-gcc编译,则使用riscv64-unknown-linux-gnu-readelf命令查看
- 在Requesting处可看到可执行文件依赖库,去开发板对应位置如/lib/ld*查看是否有库文件,如果没有,则从编译工具文件夹复制或者换编译工具