第10章:交叉编译工具链安装
好,咱们进入正题。交叉编译工具链,说白了就是一套能在你的PC上生成ARM架构可执行文件的编译器。我刚开始接触联发科平台时,就被这个“交叉”概念绕晕过——为什么不能在板子上直接编译?你想想看,嵌入式设备那点算力,编译个Linux内核得等到猴年马月去。
10.1 下载官方GCC交叉编译器
MediaTek官方提供的GCC交叉编译器,通常以arm-linux-gnueabihf-为前缀。我个人习惯从联发科官方开源网站(如git.mediatek.com)或芯片SDK包中获取。注意,不同芯片型号对应的工具链版本可能不同。
⚠ 重要提醒: 不要随便从网上下载一个arm-linux-gnueabihf-gcc就用。我在项目中遇到过,有人用了Ubuntu源里的通用版本,结果链接时符号对不上,折腾了两天才发现是工具链版本不匹配。
下载步骤大致如下:
- 登录联发科开发者平台,找到对应芯片的SDK包
- 在SDK的
toolchain/目录下找到预编译好的工具链压缩包 - 或者从官方Git仓库克隆:
git clone https://github.com/MediaTek-Labs/mtk-toolchain.git - 确认压缩包格式,通常是
.tar.bz2或.tar.xz
举个例子,MT7621平台的工具链包名可能是:
arm-linux-gnueabihf-gcc-7.5.0.tar.bz2
10.2 解压与安装
拿到压缩包后,解压到指定目录。我建议统一放在/opt/下,方便管理。
sudo mkdir -p /opt/mtk-toolchain
sudo tar -xvf arm-linux-gnueabihf-gcc-7.5.0.tar.bz2 -C /opt/mtk-toolchain/
解压完成后,目录结构大概是这样:
/opt/mtk-toolchain/
├── arm-linux-gnueabihf
│ ├── bin/
│ ├── lib/
│ ├── include/
│ └── ...
└── ...
💡 小技巧: 解压前先检查一下磁盘空间。工具链动辄几百MB,我曾经在虚拟机里解压到一半才发现磁盘满了,那叫一个尴尬。
10.3 配置环境变量
环境变量配置,说白了就是告诉系统“我的编译器在哪”。我个人习惯把配置写到~/.bashrc里,这样每次打开终端都能直接用。
打开配置文件:
vim ~/.bashrc
在文件末尾添加:
export PATH=$PATH:/opt/mtk-toolchain/arm-linux-gnueabihf/bin
export CROSS_COMPILE=arm-linux-gnueabihf-
export ARCH=arm
然后使配置生效:
source ~/.bashrc
这里解释一下:
PATH:把工具链的bin目录加入系统路径CROSS_COMPILE:指定交叉编译器的前缀,很多Makefile会读取这个变量ARCH:指定目标架构,联发科平台通常是ARM
🔑 关键点: 如果你同时维护多个项目,建议在项目根目录下创建一个
setenv.sh脚本,每次切换项目时source一下。这样不会污染全局环境。
10.4 验证安装
配置完环境变量,咱们来验证一下。打开终端,输入:
arm-linux-gnueabihf-gcc --version
如果看到类似下面的输出,说明安装成功:
arm-linux-gnueabihf-gcc (GCC) 7.5.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
再写个简单的测试程序:
#include <stdio.h>
int main() {
printf("Hello, MediaTek!\n");
return 0;
}
用交叉编译器编译:
arm-linux-gnueabihf-gcc -o hello hello.c
然后用file命令查看生成的文件:
file hello
输出应该是:
hello: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 3.2.0, not stripped
看到“ARM”字样,说明编译出来的确实是ARM架构的可执行文件。
⚠ 常见问题: 如果提示“command not found”,先检查PATH是否配置正确。我曾经犯过一个低级错误——把路径写成了
/opt/mtk-toolchain/arm-linux-gnueabihf/bin/,多了一个斜杠,结果死活找不到命令。
10.5 避坑指南
嗯,这里要重点说一下。交叉编译工具链的坑不少,我踩过的几个分享给你:
- 版本不匹配:联发科不同芯片对GCC版本有要求。比如MT7621用7.5.0,MT7688可能就得用5.4.0。我曾经把MT7621的工具链用在MT7688上,编译出来的程序跑起来就段错误。
- 32位 vs 64位:有些老工具链是32位的,需要在64位系统上安装32位兼容库:
sudo apt-get install lib32z1 lib32ncurses5 - 权限问题:解压到
/opt/需要sudo,但编译时建议用普通用户。我习惯把工具链复制一份到用户目录下:cp -r /opt/mtk-toolchain ~/my-toolchain
10.6 进阶:多版本管理
如果你像我一样,同时维护多个联发科项目,建议用update-alternatives管理多版本工具链。或者更简单点,写个shell函数:
function use_mtk_toolchain() {
case $1 in
mt7621)
export PATH=/opt/mtk-toolchain/7.5.0/bin:$PATH
;;
mt7688)
export PATH=/opt/mtk-toolchain/5.4.0/bin:$PATH
;;
*)
echo "Unknown platform: $1"
;;
esac
}
这样切换项目时,一行命令搞定:
use_mtk_toolchain mt7621
好了,交叉编译工具链的安装就这些。记住,工具链是嵌入式开发的第一步,这一步走稳了,后面编译内核、驱动、应用才会顺畅。下一章咱们聊聊如何用这套工具链编译一个完整的Linux内核。