编译 Qt5.7.1 for ARM64(基于Windows)(第二版)
2025-11-30 14:45:36

上次在《制作交叉 Qt 5.7.1 for Windows》文中编译时需要挂载远程Linux根文件,由于远程机器和我的宿主机器不在一个局域网,导致中途偶有断连的情况,然后编译就中断了。
还有另一个小毛病就是最后安装阶段总是会安装到-sysroot指定的目录下去,这远程I/O也不流畅。
所以这次的目标是在Windows本机编译,重点工作是制作一份sysroot

#制作sysroot

1
2
3
apt install debootstrap
debootstrap --arch=arm64 --variant=minbase focal /opt/sysroot-focal http://mirrors.aliyun.com/ubuntu-ports/
chroot /opt/sysroot-focal

参数含义:

  • --arch:系统架构
  • --variant:最小化安装
  • focal:系统代号

#安装库

先编辑仓库源/etc/apt/sources.list

1
deb http://mirrors.aliyun.com/ubuntu-ports/ focal main restricted universe multiverse

安装需要用到的库,因为我要编译Qt5.7.1,所以我安装了以下这些:

1
2
apt update
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,然后打包

1
2
3
4
5
# 退出sysroot
exit

cd /opt/sysroot-focal
tar -cJvhf ../sysroot-focal-arm64.tar.xz usr/include usr/lib/aarch64-linux-gnu

将Linux上打包好的sysroot-focal-arm64.tar.xz拷贝到Windows宿主机,解压后编辑/usr/lib/aarch64-linux-gnu/libc.so文件

1
2
3
4
5
/* GNU ld script
Use the shared library, but some functions are only in
the static library, so try that secondarily. */
OUTPUT_FORMAT(elf64-littleaarch64)
GROUP ( /lib/aarch64-linux-gnu/libc.so.6 /usr/lib/aarch64-linux-gnu/libc_nonshared.a AS_NEEDED ( /lib/aarch64-linux-gnu/ld-linux-aarch64.so.1 ) )

去掉其中的路径,只保留文件名

1
2
3
4
5
/* GNU ld script
Use the shared library, but some functions are only in
the static library, so try that secondarily. */
OUTPUT_FORMAT(elf64-littleaarch64)
GROUP ( libc.so.6 libc_nonshared.a AS_NEEDED ( ld-linux-aarch64.so.1 ) )

至此,这个sysroot就可以在Windows上使用了。

#编译Qt5.7.1

编译还是和以前一样,只不过-sysroot指向本机目录了

1
2
3
4
5
6
7
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 C:\ai\sysroot-focal-arm64 -confirm-license -opensource -release -opengl es2 -posix-ipc -nomake examples -nomake tests -D QT_HAVE_POLL -L C:\ai\sysroot-focal-arm64\usr\lib\aarch64-linux-gnu

mingw32-make -j
mingw32-make install

#编译其他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=C:\ai\sysroot-focal-arm64 QMAKE_LFLAGS+=--sysroot=C:\ai\sysroot-focal-arm64
mingw32-make -j
mingw32-make install