1. 为什么需要ARM交叉编译环境
在嵌入式开发中,我们经常会遇到一个尴尬的情况:开发用的电脑是x86架构的,而目标设备却是ARM架构的。这就好比你想用中文写一封信,但收信人只能看懂英文。交叉编译工具链就是解决这个问题的"翻译官",它能在x86电脑上生成ARM设备能执行的代码。
我刚开始接触嵌入式开发时,最头疼的就是这个环节。明明在Ubuntu上编译运行得好好的程序,一到开发板上就跑不起来。后来才明白,普通编译器生成的是针对本地CPU架构的代码,而我们需要的是能生成ARM指令集的特殊编译器。
Qt Creator作为一款强大的跨平台IDE,支持通过配置交叉编译工具链来实现这个功能。不过说实话,第一次配置时确实踩了不少坑,比如工具链版本不匹配、Qt库编译选项不对、环境变量设置错误等等。下面我就把这几年的实战经验整理出来,手把手教你避开这些雷区。
2. 准备工作:安装必要组件
2.1 获取ARM交叉编译工具链
首先需要获取合适的交叉编译工具链。常见的有以下几种选择:
- Linaro提供的预编译工具链
- ARM官方提供的gcc-arm-none-eabi
- 芯片厂商提供的定制工具链(如树莓派的tools)
我推荐新手使用Linaro的版本,兼容性好且文档齐全。以gcc-linaro-7.5.0为例,可以通过以下命令下载:
wget https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz解压到/opt目录是个好习惯:
sudo tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz -C /opt别忘了把工具链路径加入环境变量:
echo 'export PATH=/opt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin:$PATH' >> ~/.bashrc source ~/.bashrc验证安装是否成功:
arm-linux-gnueabihf-gcc --version2.2 安装Qt Creator
虽然Ubuntu软件源里有Qt Creator,但版本通常比较旧。建议直接从官网下载最新版:
wget https://download.qt.io/official_releases/qtcreator/4.14/4.14.0/qt-creator-opensource-linux-x86_64-4.14.0.run chmod +x qt-creator-opensource-linux-x86_64-4.14.0.run ./qt-creator-opensource-linux-x86_64-4.14.0.run安装过程会有图形界面向导,记得勾选"Desktop GCC"组件,后面调试本地程序时会用到。
3. 交叉编译Qt库
3.1 获取Qt源码
这一步很多教程会忽略,但非常重要。目标设备上的Qt库版本必须和开发环境一致。假设目标设备运行的是Qt 5.12.8:
wget https://download.qt.io/official_releases/qt/5.12/5.12.8/single/qt-everywhere-src-5.12.8.tar.xz tar -xvf qt-everywhere-src-5.12.8.tar.xz cd qt-everywhere-src-5.12.83.2 配置编译选项
创建编译配置脚本configure.sh:
#!/bin/bash ./configure \ -prefix /opt/qt5.12.8-arm \ -release \ -opensource \ -confirm-license \ -xplatform linux-arm-gnueabi-g++ \ -nomake examples \ -nomake tests \ -no-opengl \ -no-xcb \ -no-openssl \ -no-pch \ -no-dbus \ -no-glib \ -no-cups \ -no-iconv \ -skip qt3d \ -skip qtwebengine关键参数说明:
- -xplatform:指定交叉编译目标平台
- -prefix:安装目录
- -nomake examples/tests:跳过示例和测试节省时间
- -skip:跳过不需要的模块
3.3 开始编译
先应用配置:
chmod +x configure.sh ./configure.sh然后开始漫长的编译过程(建议喝杯咖啡):
make -j$(nproc) sudo make install编译完成后,检查/opt/qt5.12.8-arm目录下是否生成了bin、lib等子目录。
4. 配置Qt Creator
4.1 添加qmake路径
打开Qt Creator,进入Tools > Options > Kits:
- 选择Qt Versions标签页
- 点击Add按钮
- 选择/opt/qt5.12.8-arm/bin/qmake
- 版本名称填写"Qt 5.12.8 ARM"
4.2 设置编译器
在同一个界面的Compilers标签页:
- 点击Add > GCC > C
- 名称填写"ARM GCC (C)"
- 路径选择/opt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc
重复相同步骤添加C++编译器,选择arm-linux-gnueabihf-g++。
4.3 配置调试器
在Debuggers标签页:
- 点击Add
- 名称填写"ARM GDB"
- 路径选择工具链中的gdb:/opt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gdb
4.4 创建构建套件(Kit)
在Kits标签页:
- 点击Add
- 名称填写"ARM Qt5.12.8"
- Device type选择"Generic Linux Device"
- 编译器选择前面配置的ARM GCC
- Qt version选择"Qt 5.12.8 ARM"
- 调试器选择"ARM GDB"
5. 实战:创建交叉编译项目
5.1 新建Qt Widgets项目
File > New File or Project > Application > Qt Widgets Application。在Kit Selection页面:
- 勾选"Desktop Qt"用于本地调试
- 勾选"ARM Qt5.12.8"用于交叉编译
- 取消其他选项
5.2 配置构建目录
在Projects视图:
- 选择"ARM Qt5.12.8"构建套件
- 构建目录建议设置为../build-arm(避免与本地构建混淆)
- 构建模式选择Release(Debug版本需要设备上有调试符号)
5.3 部署到目标设备
在Run配置中:
- 添加自定义部署步骤
- 使用scp命令将编译好的程序上传到开发板:
scp %{buildDir}/%{target} user@device_ip:/home/user- 远程执行命令配置为:
ssh user@device_ip ./%{target}6. 常见问题排查
6.1 链接库缺失错误
如果运行时提示缺少库,需要将目标设备的库复制到开发机。例如:
scp -r root@device_ip:/usr/lib/arm-linux-gnueabihf /opt/sysroot/usr/lib然后在Qt Creator的构建环境变量中添加:
SYSROOT=/opt/sysroot6.2 字体显示异常
如果界面字体显示为方块,需要在开发板上安装字体:
sudo apt install ttf-wqy-zenhei或者在代码中指定字体路径:
QFontDatabase::addApplicationFont("/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc");6.3 触摸屏校准
嵌入式设备可能需要额外的触摸屏配置。创建一个/etc/pointercal文件:
TSLIB_TSDEVICE=/dev/input/event1 ts_calibrate然后在Qt启动参数中添加:
export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event1:rotate=0