使用MSYS2替代原生MinGW-w64搭建Qt 4.8.7 ARM32交叉编译环境,优势是MSYS2的包管理更便捷、依赖兼容性更强,且能完美兼容POSIX命令行环境(适配Qt 4.8.7的Unix风格编译脚本)。以下是基于MSYS2的完整实操指南,核心步骤与原生MinGW一致,但环境搭建环节适配MSYS2生态:
一、前置准备:下载清单(替换原生MinGW为MSYS2)
|
|
|
| 组件名称 |
用途 |
下载地址/获取方式 |
| MSYS2 |
替代原生MinGW,提供编译环境 |
MSYS2官网(选Windows x86_64安装包) |
| ARM32交叉编译工具链 |
编译ARM32架构程序 |
推荐Linaro 7.5.0(arm-linux-gnueabihf):Linaro官网 |
| Qt 4.8.7源码 |
Qt核心源码 |
Qt Archive |
| 7-Zip |
解压压缩包 |
7-Zip官网 |
说明:MSYS2内置Python 2.7/Perl/CMake,无需单独安装,通过包管理器一键部署即可。
二、步骤1:安装并配置MSYS2
1.1 安装MSYS2
若终端提示“关闭后重启”,则关闭终端,重新打开MSYS2 MSYS终端,再次执行:
1.2 安装MSYS2编译依赖(替代原生MinGW/Perl/Python/CMake)
打开MSYS2 MinGW64终端(关键:必须选MinGW64环境,而非MSYS环境),执行以下命令安装依赖:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| pacman -S --needed mingw-w64-x86_64-gcc
pacman -U https://repo.msys2.org/mingw/mingw64/mingw-w64-x86_64-python2-2.7.18-8-any.pkg.tar.zst
pacman -S --needed mingw-w64-x86_64-perl
pacman -S --needed mingw-w64-x86_64-cmake
pacman -S --needed mingw-w64-x86_64-make
pacman -S --needed mingw-w64-x86_64-zlib mingw-w64-x86_64-libpng mingw-w64-x86_64-libjpeg-turbo
|
1.3 验证MSYS2环境
在MinGW64终端执行以下命令,验证依赖安装成功:
1 2 3 4 5 6 7 8
| gcc -v
python2 --version
perl -v
mingw32-make -v
|
三、步骤2:配置ARM32交叉编译工具链(适配MSYS2)
2.1 解压Linaro工具链到MSYS2路径
2.2 配置MSYS2环境变量(永久生效)
- 打开MSYS2 MinGW64终端,编辑环境变量配置文件:
1 2 3 4
| export PATH=/opt/arm-linux-gnueabihf-7.5.0/bin:$PATH
alias arm-gcc='arm-linux-gnueabihf-gcc'
|
2.3 验证交叉工具链
在MinGW64终端执行:
1
| arm-linux-gnueabihf-gcc -v
|
输出Linaro 7.5.0版本信息则成功(若提示“找不到命令”,检查工具链解压路径是否正确)。
四、步骤3:修改Qt 4.8.7源码(与原生MinGW一致,适配MSYS2路径)
4.1 解压Qt源码到MSYS2路径
将Qt 4.8.7源码解压到MSYS2可识别的路径(如C:\msys64\home\你的用户名\qt-4.8.7-arm),MSYS2中路径表示为/home/你的用户名/qt-4.8.7-arm(避免Windows风格路径导致编译报错)。
4.2 修改交叉编译配置文件
复制并修改mkspecs配置文件(与原生MinGW步骤一致,仅路径适配MSYS2):
- 进入Qt源码目录:
1
| cd /home/你的用户名/qt-4.8.7-arm
|
- 复制并修改配置文件:
1 2 3 4
| cp -r mkspecs/qws/linux-arm-gnueabi-g++ mkspecs/qws/linux-arm-gnueabihf-g++
vi mkspecs/qws/linux-arm-gnueabihf-g++/qmake.conf
|
- 替换
qmake.conf内容(与原生MinGW的配置一致,工具链前缀不变):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| MAKEFILE_GENERATOR = UNIX TEMPLATE = app CONFIG += qt warn_on release incremental link_prl gdb_dwarf_index QT += core gui QMAKE_INCREMENTAL_STYLE = sublib
CROSS_COMPILE = arm-linux-gnueabihf- CC = $$CROSS_COMPILE gcc CXX = $$CROSS_COMPILE g++ LINK = $$CROSS_COMPILE g++ AR = $$CROSS_COMPILE ar cqs RANLIB = $$CROSS_COMPILE ranlib STRIP = $$CROSS_COMPILE strip RC = $$CROSS_COMPILE windres
QMAKE_CFLAGS = -march=armv7-a -mtune=cortex-a9 -mfpu=neon -mfloat-abi=hard -O2 QMAKE_CXXFLAGS = $$QMAKE_CFLAGS QMAKE_LFLAGS = -march=armv7-a -mtune=cortex-a9 -mfpu=neon -mfloat-abi=hard
QMAKE_INCDIR = QMAKE_LIBDIR = QMAKE_INCDIR_QT = $$[QT_INSTALL_HEADERS] QMAKE_LIBDIR_QT = $$[QT_INSTALL_LIBS] QMAKE_LIBS = -lrt -ldl -lpthread QMAKE_LIBS_QT_ENTRY = -lQtCore -lQtGui QMAKE_LIBS_GUI = -lX11 -lXext -lXt -lm -lSM -lICE -lfontconfig -lfreetype QMAKE_LIBS_CORE = -lz -lm -ldl -lpthread
DESTDIR = ../bin
|
五、步骤4:配置并编译Qt 4.8.7 ARM版本(MSYS2终端执行)
5.1 清理旧配置(首次编译可跳过)
1 2
| cd /home/你的用户名/qt-4.8.7-arm mingw32-make distclean
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| ./configure -prefix /home/你的用户名/qt-4.8.7-arm-build \ -opensource \ -confirm-license \ -release \ -shared \ -embedded arm \ -xplatform qws/linux-arm-gnueabihf-g++ \ -no-webkit \ -no-phonon \ -no-phonon-backend \ -no-qt3support \ -no-multimedia \ -no-ltcg \ -no-dbus \ -no-opengl \ -no-openvg \ -no-svg \ -no-javascript-jit \ -no-script \ -no-scripttools \ -no-declarative \ -no-declarative-debug \ -nomake demos \ -nomake examples \ -nomake docs \ -qt-libpng \ -qt-libjpeg \ -qt-zlib \ -little-endian \ -host-little-endian \ -verbose
|
关键差异:-prefix使用MSYS2的Unix风格路径(/home/...),而非Windows路径(D:...),避免Qt配置解析路径出错。
5.3 编译Qt源码
5.4 安装编译结果
安装完成后,/home/你的用户名/qt-4.8.7-arm-build(对应Windows路径C:\msys64\home\你的用户名\qt-4.8.7-arm-build)即为ARM交叉编译环境。
六、步骤5:验证交叉编译环境(MSYS2终端)
6.1 新建测试工程
在MSYS2中新建测试目录:
1 2
| mkdir /home/你的用户名/qt-arm-test cd /home/你的用户名/qt-arm-test
|
新建test.pro:
1 2 3 4
| QT += core gui TARGET = test TEMPLATE = app SOURCES += main.cpp
|
新建main.cpp:
1 2 3 4 5 6 7 8 9 10
| #include <QApplication> #include <QLabel>
int main(int argc, char *argv[]) { QApplication a(argc, argv); QLabel lbl("Hello ARM32 Qt 4.8.7 (MSYS2)!"); lbl.show(); return a.exec(); }
|
6.2 生成Makefile并编译
1 2 3 4
| /home/你的用户名/qt-4.8.7-arm-build/bin/qmake -spec qws/linux-arm-gnueabihf-g++ test.pro
mingw32-make
|
6.3 验证ARM程序
输出类似test: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked,说明成功。
七、MSYS2专属问题与解决
configure提示“bash: ./configure: 权限不够”:
执行chmod +x configure赋予执行权限。
编译时提示“找不到python”:
MSYS2中Python 2.7命令为python2,Qt 4.8.7默认找python,需创建软链接:
1
| ln -s /mingw64/bin/python2.exe /mingw64/bin/python.exe
|
工具链路径识别失败:
MSYS2中/opt对应Windows路径C:\msys64\opt,确保工具链解压到该路径,且~/.bashrc中PATH配置正确。
mingw32-make报错“recipe for target failed”:
降低编译核心数(如-j4),避免内存不足;检查Qt源码路径是否含中文/空格。
总结
用MSYS2替代原生MinGW的核心优势是:
无需手动安装Python/Perl/CMake,包管理器一键部署,版本兼容性更高;
POSIX终端环境更适配Qt 4.8.7的Unix风格编译脚本,减少路径/命令兼容问题;
环境变量配置永久生效,无需频繁修改系统PATH。
核心注意点:全程使用MSYS2 MinGW64终端(而非MSYS终端/系统CMD),路径统一使用MSYS2的Unix风格路径(/home/...),避免Windows路径解析错误。