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

在Windows 10中搭建Qt 4.8.7 ARM32交叉编译环境,核心是获取ARM32交叉编译工具链编译Qt 4.8.7源码适配ARM架构配置环境变量与编译规则,以下是分步实操指南(全程需管理员权限,建议关闭杀毒软件避免文件拦截)。

一、前置准备:确定核心依赖与下载清单

Qt 4.8.7本身不提供预编译的ARM32交叉编译包,需手动编译源码,需下载以下组件(版本需严格匹配,避免兼容性问题):

组件名称 用途 下载地址/获取方式
MinGW-w64(8.1.0) Windows下的GCC编译环境 SourceForge(选x86_64-posix-seh)
ARM32交叉编译工具链 编译ARM32架构程序 推荐Linaro 7.5.0(arm-linux-gnueabihf):Linaro官网
Qt 4.8.7源码 Qt核心源码(需适配ARM) Qt Archive
Python 2.7.x Qt 4.8.7编译依赖(必须2.7) Python官网(选Windows x86-64 MSI)
Perl 5.28+ Qt编译脚本依赖 Strawberry Perl(选64位版本)
CMake 3.10+ 辅助编译(可选但建议) CMake官网(选Windows x64 Installer)
7-Zip 解压tar.gz/压缩包 7-Zip官网

二、步骤1:安装基础编译环境(Windows侧)

1.1 安装MinGW-w64

  • 下载MinGW-w64后解压到固定路径(如D:\mingw64),将D:\mingw64\bin添加到系统环境变量Path(优先级高于系统自带MinGW)。

  • 验证:打开CMD,输入gcc -v,输出MinGW-w64 8.1.0版本信息则成功。

1.2 安装Python 2.7 + Perl + CMake

  • Python 2.7:安装时勾选“Add Python to PATH”,验证python --version输出2.7.x。

  • Strawberry Perl:默认安装即可,验证perl -v输出5.28+版本。

  • CMake:安装时勾选“Add CMake to the system PATH for all users”,验证cmake --version输出3.10+。

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

2.1 解压并配置Linaro工具链

  • 下载Linaro工具链(如gcc-linaro-7.5.0-2019.12-i686-mingw32_arm-linux-gnueabihf.tar.xz),解压到固定路径(如D:\arm-linux-gnueabihf-7.5.0)。

  • 将工具链bin目录(D:\arm-linux-gnueabihf-7.5.0\bin)添加到系统环境变量Path

  • 验证:CMD输入arm-linux-gnueabihf-gcc -v,输出Linaro 7.5.0版本信息则成功。

四、步骤3:修改Qt 4.8.7源码适配ARM交叉编译

Qt 4.8.7默认不支持Windows下ARM交叉编译,需手动修改配置文件:

4.1 解压Qt源码

qt-everywhere-opensource-src-4.8.7.tar.gz用7-Zip解压到固定路径(如D:\qt-4.8.7-arm),避免路径含中文/空格。

4.2 修改交叉编译配置文件

Qt 4.8.7的交叉编译需通过mkspecs目录下的配置文件定义,步骤:

  1. 复制D:\qt-4.8.7-arm\mkspecs\qws\linux-arm-gnueabi-g++目录,重命名为linux-arm-gnueabihf-g++(匹配Linaro工具链的hf(硬件浮点))。

  2. 编辑新目录下的qmake.conf,替换内容为:

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
34
35
36
37
38
39
40
41
42
# 基础配置
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架构参数(适配ARM32,如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

# Qt运行环境(QWS是Qt 4的嵌入式窗口系统)
QMAKE_INCDIR =
QMAKE_LIBDIR =
QMAKE_INCDIR_QT = $$[QT_INSTALL_HEADERS]
QMAKE_LIBDIR_QT = $$[QT_INSTALL_LIBS]
QMAKE_INCDIR_OPENGL_ES2 =
QMAKE_LIBDIR_OPENGL_ES2 =
QMAKE_INCDIR_EGL =
QMAKE_LIBDIR_EGL =
QMAKE_INCDIR_OPENVG =
QMAKE_LIBDIR_OPENVG =

# 系统库
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

注:-march=armv7-a/-mtune=cortex-a9需根据目标ARM芯片调整(如ARMv6则改-march=armv6)。

五、步骤4:配置并编译Qt 4.8.7 ARM版本

5.1 生成编译配置(关键:避免Qt默认编译Windows版本)

打开MinGW-w64的CMD窗口(必须用MinGW的终端,而非系统CMD),执行以下命令:

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
34
35
36
37
38
# 进入Qt源码根目录
cd /d D:\qt-4.8.7-arm

# 清理旧配置(首次编译可跳过)
mingw32-make distclean

# 配置交叉编译参数(核心命令)
configure -prefix D:\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:指定Qt ARM版本安装路径;

  • -embedded arm:启用嵌入式ARM支持(Qt 4的QWS);

  • -xplatform:指定步骤4.2中修改的交叉编译配置;

  • 禁用webkit/phonon等非必需模块,减少编译时间和报错。

5.2 编译Qt源码

配置成功后(无error),执行编译命令:

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

⚠️ 编译耗时(1-2小时),若报错:

  • 检查工具链路径是否正确;

  • 检查qmake.conf中工具链前缀是否匹配;

  • 若提示“python找不到”,确保Python 2.7在PATH最前(Qt 4不兼容Python 3)。

5.3 安装编译后的Qt ARM版本

编译完成后执行:

1
mingw32-make install

安装完成后,D:\qt-4.8.7-arm-build即为可用于ARM32交叉编译的Qt环境。

六、步骤5:验证交叉编译环境

编写简单Qt测试程序,验证能否编译出ARM32可执行文件:

6.1 新建测试工程

在任意目录新建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!");
lbl.show();
return a.exec();
}

6.2 用Qt ARM版本的qmake生成Makefile

打开MinGW终端,执行:

1
2
# 指定ARM版本的qmake路径
D:\qt-4.8.7-arm-build\bin\qmake.exe test.pro -spec qws/linux-arm-gnueabihf-g++

6.3 编译生成ARM32程序

执行:

1
mingw32-make

编译完成后生成test可执行文件,用file命令(需安装Git for Windows,或复制到Linux)验证:

1
2
# Git Bash中执行
file test

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

七、常见问题与解决

  1. configure阶段提示“无法找到arm-linux-gnueabihf-gcc”

    1. 检查工具链bin目录是否在PATH中,重启终端生效;

    2. 确认工具链解压完整,无文件缺失。

  2. 编译阶段提示“undefined reference to xxx”

    1. 禁用非必需模块(如webkit),Qt 4.8.7部分模块对ARM交叉编译支持差;

    2. 检查qmake.conf中链接库参数(QMAKE_LIBS)是否完整。

  3. Python版本错误

    1. 卸载Python 3,仅保留Python 2.7,或在PATH中优先放置Python 2.7路径。

总结

Win10下Qt 4.8.7 ARM32交叉编译的核心是:

  1. 搭建MinGW+ARM交叉工具链环境;

  2. 修改Qt源码的交叉编译配置文件;

  3. 通过configure指定ARM编译参数,编译源码;

  4. 验证生成的程序为ARM32架构。

若追求效率,也可在Linux虚拟机中完成Qt 4.8.7 ARM交叉编译(Linux下交叉编译兼容性更好),再将编译结果复制到Windows使用。