基于MSYS2搭建Qt4.8.7-armv7交叉编译环境

使用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安装包,默认安装到C:\msys64禁止修改路径含中文/空格);

  • 安装完成后自动打开MSYS2终端,执行更新命令(首次更新需耐心等待):

1
pacman -Syu
若终端提示“关闭后重启”,则关闭终端,重新打开MSYS2 MSYS终端,再次执行:
1
pacman -Su

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
# 安装MinGW64 GCC(核心编译工具)
pacman -S --needed mingw-w64-x86_64-gcc

# 安装Python 2.7(Qt 4.8.7编译必需)
# pacman -S --needed mingw-w64-x86_64-python2
pacman -U https://repo.msys2.org/mingw/mingw64/mingw-w64-x86_64-python2-2.7.18-8-any.pkg.tar.zst

# 安装Perl(Qt编译脚本依赖)
pacman -S --needed mingw-w64-x86_64-perl

# 安装CMake(辅助编译)
pacman -S --needed mingw-w64-x86_64-cmake

# 安装make工具(mingw32-make)
pacman -S --needed mingw-w64-x86_64-make

# 安装依赖库(如zlib、libpng,Qt编译需)
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
gcc -v
# 验证Python 2.7
python2 --version
# 验证Perl
perl -v
# 验证make
mingw32-make -v

三、步骤2:配置ARM32交叉编译工具链(适配MSYS2)

2.1 解压Linaro工具链到MSYS2路径

  • 下载Linaro工具链(如gcc-linaro-7.5.0-2019.12-i686-mingw32_arm-linux-gnueabihf.tar.xz);

  • 用7-Zip解压到MSYS2的目录下(建议路径:C:\msys64\opt\arm-linux-gnueabihf-7.5.0),避免路径含空格/中文。

2.2 配置MSYS2环境变量(永久生效)

  • 打开MSYS2 MinGW64终端,编辑环境变量配置文件:
1
vi ~/.bashrc
  • 在文件末尾添加以下内容(指定交叉工具链路径):
1
2
3
4
# ARM交叉工具链路径
export PATH=/opt/arm-linux-gnueabihf-7.5.0/bin:$PATH
# 别名(可选,简化命令)
alias arm-gcc='arm-linux-gnueabihf-gcc'
  • 生效配置:
1
source ~/.bashrc

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):

  1. 进入Qt源码目录:
1
cd /home/你的用户名/qt-4.8.7-arm
  1. 复制并修改配置文件:
1
2
3
4
# 复制ARM配置模板
cp -r mkspecs/qws/linux-arm-gnueabi-g++ mkspecs/qws/linux-arm-gnueabihf-g++
# 编辑qmake.conf
vi mkspecs/qws/linux-arm-gnueabihf-g++/qmake.conf
  1. 替换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

# 交叉编译工具链前缀(匹配Linaro)
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

# ARM架构参数(适配ARMv7)
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

# 系统库与路径(适配MSYS2)
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

5.2 执行configure(核心:适配MSYS2路径)

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源码

1
2
# 多核编译(-j后接CPU核心数,如8核则-j8)
mingw32-make -j8

5.4 安装编译结果

1
mingw32-make install

安装完成后,/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
# 使用ARM版本的qmake
/home/你的用户名/qt-4.8.7-arm-build/bin/qmake -spec qws/linux-arm-gnueabihf-g++ test.pro
# 编译
mingw32-make

6.3 验证ARM程序

  • 安装file命令(MSYS2终端):
1
pacman -S file
  • 验证程序架构:
1
file test

输出类似test: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked,说明成功。

七、MSYS2专属问题与解决

  1. configure提示“bash: ./configure: 权限不够”

  2. 执行chmod +x configure赋予执行权限。

  3. 编译时提示“找不到python”

  4. MSYS2中Python 2.7命令为python2,Qt 4.8.7默认找python,需创建软链接:

1
ln -s /mingw64/bin/python2.exe /mingw64/bin/python.exe
  1. 工具链路径识别失败

  2. MSYS2中/opt对应Windows路径C:\msys64\opt,确保工具链解压到该路径,且~/.bashrc中PATH配置正确。

  3. mingw32-make报错“recipe for target failed”

  4. 降低编译核心数(如-j4),避免内存不足;检查Qt源码路径是否含中文/空格。

总结

用MSYS2替代原生MinGW的核心优势是:

  1. 无需手动安装Python/Perl/CMake,包管理器一键部署,版本兼容性更高;

  2. POSIX终端环境更适配Qt 4.8.7的Unix风格编译脚本,减少路径/命令兼容问题;

  3. 环境变量配置永久生效,无需频繁修改系统PATH。

核心注意点:全程使用MSYS2 MinGW64终端(而非MSYS终端/系统CMD),路径统一使用MSYS2的Unix风格路径(/home/...),避免Windows路径解析错误。