什么是交叉编译
原本使用 gcc 使用编译器, 用来把我们写的 C语言程序文件翻译成对应平台(X86)可以识别的二进制编码。
因此我们需要在电脑中编译一个开发板能识别的二进制编码,这个编译过程就称为交叉编译,从 X86平台编译出来ARM平台的可执行文件。使用的工具就是 arm-linux-XXXXXX。其中一个工具为 arm-linux-gcc 用来交叉编译出C的可执行文件。
安装工具链
- 下载工具链:链接
- 通过共享目录,将文件解压到根目录
sudo tar -Jxvf arm-linux-gnueabi-5.4.0.tar.xz -C /
- 在
/usr/local/
下创建一个新的目录arm
sudo mkdir /usr/local/arm
- 给目录释放全部的权限
sudo chmod 777 /usr/local/arm
- 将解压后的文件夹
gcc-4.6.4
复制到/usr/local/arm
中
sudo cp -r ***/arm /usr/local/arm
- 添加编译器环境变量,让所有位置都可以使用该交叉编译器
vim ~/.bashrc
在最后面添加:
export PATH=/usr/local/arm/5.4.0/usr/bin:$PATH
- 检查配置是否成功
source ~/.bashrc // 从新生效配置文件(环境变量)
arm-linux-gcc -v // 查看版本信息
- 交叉编译器的用法
- 与普通 gcc 的用法几乎没有区别,只是将 gcc 换成 arm-linux-gcc
- gcc 编译的文件为 x86 格式
- arm-linux-gcc 编译的文件格式为 ARM 文件
- 编译后只需要把生成的可执行文件传入开发板即可,除非需要用到资源文件(图像、视频、音乐……)
- 在开发板遇到执行错误的情况,先检查是否有给予 可执行 的权限。
- 使用 arm-linux-gcc 出现以下问题:
arm-linux-gcc Output.c -o Output.o
/usr/local/arm/5.4.0/usr/bin/../libexec/gcc/arm-none-linux-gnueabi/5.4.0/cc1:
error while loading shared libraries: libmpfr.so.4:
cannot open shared object file: No such file or directory
原因是系统中使用的是 so.6 的库,但是我们编译用的是 so.4。
解决办法:把 so.6 做成一个连接文件为 so.4 即可。
$sudo ln -s /usr/lib/x86_64-linux-gnu/libmpfr.so.6 /usr/lib/x86_64-linux-gnu/libmpfr.so.4