ArchLinux下搭建Arm交叉编译环境
这学期新开了一门Arm嵌入式,由于开发板不具备资自主编译的能力,所以必须搭建交叉编译环境。当然,交叉编译环境的主编译机器以Linux为佳,而我的主机恰好是Arch,原本以为在Arch上的交叉编译环境的搭建会轻松很多,然而事实是确实经历了一番坎坷的旅程,最终在群友的协助下完成了环境的搭建,故记录此过程以供大家参考。
环境说明:
编译环境:
Arch Linux x86_64
运行环境:
ARM926EJ-5
很显然,我们的编译环境是64位的操作系统,运行时环境是32位的arm架构的机器。我们的思路也很简单,就是如果你想在开发板上运行程序,先在自己的主机上用arm-linux-gcc进行编译,再拿到开发板上去运行。
准备工作1——启用 [multilib] 和Octopi
启用multilib
首先我们编辑我们的ArchLinux镜像文件,启用被注释的[multilib]
镜像源,并且更新系统。这一步的目的是由于在64位的机器上编译32位的应用程序,可能会出现找不到32位的库的情况,这个库包含了大量的32位的库文件。
1 | sudo vim /etc/pacman.conf #编辑镜像文件 |
接着更新我们的系统:
1 | sudo pacman -Syu #更新系统 |
使用Octopi(可选)
我们知道,Arch Linux下默认是没有包管理器的,操作基本上是由pacman
这个十分强大的包管理器完成。而Octopi
这个包管理器可以很方便的,以图形话的方式查找到我们想要的软件包。你可以使用AUR去安装它:(如果没有yay
的话请先安装这个AUR的管理器)
1 | yay -S octopi #通过AUR安装octopi |
准备工作2——下载arm-linux-gcc
搜索后发现,网上最多人安装的还是arm-linux-gcc
交叉编译器。适合小型的、环境不是特别新的嵌入式环境。这里我已经下载好了,可以直接提取:
下载arm-linux-gcc 密码:gieq
下载完成后解压到/opt
目录下:(以图形的文件浏览器看就是多了一个FriendlyARM的文件夹)
接下来将arm-linux-gcc
添加到环境变量,首先我们编辑~/.zshrc文件
1 | sudo vim ~/.zshrc |
在最下方添加如下字段,即就是将/opt/FriendlyARM
下的bin目录到环境变量。
1 | export PATH=/opt/FriendlyARM/toolschain/4.4.3/bin/:$PATH |
保存退出后执行 source ~/.zshrc
以立即生效环境变量。这样使用arm-linux-gcc -v
查看安装的编译器版本。
准备工作3——安装缺少的包文件
当我们使用arm-linux-gcc
去编译我们的c++或c程序时会提示缺少某一个库文件,好的,那么这个库文件在哪里?首先我们可以直接去Octopi
包管理器去找有没有这个库,比如我要找libstdc++5
这个库,或者lib32-glibc
这个库,都可以直接去octopi上查找。它很方便的一个功能就是模糊查找,而且速度较快。
另一种情况,比如我们不知道哪个库文件包含有这个库,比如编译器报告A库丢失,然而你去找没有找到A库,当然你会怀疑是不是某一个库,比如B已经包含了A,我们只需要安装B即可。怎么找呢?可以使用下面的命令:
pacman -Qo 缺失的库名称
如果没有任何一个库文件包含的话,那我也就没办法了。。。
好的言归正传,经过我的测试,你可能需要安装以下这些包才能编译出一个HelloWord:
lib32-glibc
lib32-ncurses
lib32-ncurses5-compat-libs
lib32-zlib
libstdc++5
lib32-gcc-libs
编译就不必我多讲了,写一个hello,是而运行的话呢,必须先将文件拷贝到单片机下再运行