编译 Qt5.7.1 for ARM64(基于Windows)
2025-11-29 16:02:56

细节参考之前制作Linux x86_64的文章:制作交叉 Qt 5.7.1 for Windows

准备工具:

  1. qtbase-opensource-src-5.7.1.7z
  2. msys2,主要是用它的命令行工具
  3. sshfs-win,挂载Linux根文件目录
  4. 运行在Windows上的Linux aarch64的交叉编译器

#Linux上安装尽可能多的库

Qt 在配置时会检测各种库是否可用,这决定了编译出的 Qt 库有些什么功能,为了编译满血版,尽可能的安装多的库

1
sudo apt install "^libxcb.*" libx11-dev libx11-xcb-dev libxext-dev libxi-dev libxfixes-dev libglu1-mesa-dev libfreetype6-dev libxrender-dev libfontconfig1-dev libxkbcommon-dev libxkbcommon-x11-dev libdbus-1-dev libasound2-dev libpulse-dev libudev-dev libwayland-dev libatspi2.0-dev libgl1-mesa-dev libegl1-mesa-dev libgles2-mesa-dev zlib1g-dev libssl-dev libpng-dev libjpeg-dev libgbm-dev libdrm-dev libmtdev-dev unixodbc-dev libinput-dev libicu-dev libproxy-dev libdouble-conversion-dev libharfbuzz-dev freetds-dev libcups2-dev libpq-dev

#挂载sysroot

在Windows下用sshfs-win挂载远程的sysroot,记得用root用户

1
\\sshfs.r\root@192.168.27.5

#制作一份arm64的msakespec

复制mkspecs/linux-arm-gnueabi-g++文件夹,更名为linux-aarch64-gnu-g++,编辑其中的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
#
# qmake configuration for building with aarch64-linux-gnu-g++
#

MAKEFILE_GENERATOR = UNIX
CONFIG += incremental
QMAKE_INCREMENTAL_STYLE = sublib

include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)

# modifications to g++.conf
QMAKE_CC = aarch64-linux-gnu-gcc
QMAKE_CXX = aarch64-linux-gnu-g++
QMAKE_LINK = aarch64-linux-gnu-g++
QMAKE_LINK_SHLIB = aarch64-linux-gnu-g++

# modifications to linux.conf
QMAKE_AR = aarch64-linux-gnu-ar cqs
QMAKE_OBJCOPY = aarch64-linux-gnu-objcopy
QMAKE_NM = aarch64-linux-gnu-nm -P
QMAKE_STRIP = aarch64-linux-gnu-strip
load(qt_config)
QMAKE_LIBS += -lrt -lpthread

末尾添加-lrt -lpthread是因为编译QSharedMemory时链接库失败了,可能是因为交叉编译引起的。

#编译

1
2
3
4
set PATH=C:\ai\cross-toolchain\Linux-aarch64\bin;C:\msys64\usr\bin;%PATH%
mkdir build
cd build
..\configure.bat -prefix /qt5.7.1-aarch64-linux-gnu -platform win32-g++ -xplatform linux-aarch64-gnu-g++ -sysroot Z: -confirm-license -opensource -release -opengl es2 -posix-ipc -nomake examples -nomake tests -D QT_HAVE_POLL -L Z:/usr/lib/aarch64-linux-gnu

这里值得一提的地方是-prefix路径,因为Qt的原因,最后会强制安装到-sysroot+-prefix路径,所以这里写一个相对路径即可,稍后有个小技巧让其安装到本机而不是远程主机。

另一个就是手动添加了-posix-ipc,因为不添加的话,QSharedMemory会被禁用,在tools\configure\configureapp.cpp源文件中可以看到这点

1
2
3
4
if (dictionary["POSIX_IPC"] == "yes")
qconfigList += "QT_POSIX_IPC";
else if ((platform() != ANDROID) && (platform() != WINDOWS) && (platform() != WINDOWS_RT))
qconfigList << "QT_NO_SYSTEMSEMAPHORE" << "QT_NO_SHAREDMEMORY";

由于目标平台是Linux,这里会判定成功,也就添加了QT_NO_SYSTEMSEMAPHOREQT_NO_SHAREDMEMORY宏。

好了,开始编译

1
mingw32-make -j

安装前先断开Z:的挂载,然后将Z盘映射到C盘,再安装!这样Qt库就安装到本机磁盘了!

1
2
3
subst Z: C:\
mingw32-make install
subst Z: /D

#编译其他Qt模块

qtserialport模块为例

1
2
3
4
5
set PATH=C:\ai\cross-toolchain\Linux-aarch64\bin;C:\msys64\usr\bin;%PATH%
cd C:\Qt\qtserialport-opensource-src-5.7.1
C:\qt5.7.1-aarch64-linux-gnu\bin\qmake.exe -spec linux-aarch64-gnu-g++ QMAKE_CXXFLAGS+=--sysroot=Z: QMAKE_LFLAGS+=--sysroot=Z:
mingw32-make -j
mingw32-make install

最后还要提醒一下,这样编译后bin目录下只有基础的qmake.exeuic.exemoc.exe,像其他的翻译程序之类的工具需要单独编译Windows版本的。