编译 Qt5.7.1 for ARM64(基于Windows)
2025-11-29 16:02:56
细节参考之前制作Linux x86_64的文章:制作交叉 Qt 5.7.1 for Windows
准备工具:
- qtbase-opensource-src-5.7.1.7z
- msys2,主要是用它的命令行工具
- sshfs-win,挂载Linux根文件目录
- 运行在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 | # |
末尾添加-lrt -lpthread是因为编译QSharedMemory时链接库失败了,可能是因为交叉编译引起的。
#编译
1 | set PATH=C:\ai\cross-toolchain\Linux-aarch64\bin;C:\msys64\usr\bin;%PATH% |
这里值得一提的地方是-prefix路径,因为Qt的原因,最后会强制安装到-sysroot+-prefix路径,所以这里写一个相对路径即可,稍后有个小技巧让其安装到本机而不是远程主机。
另一个就是手动添加了-posix-ipc,因为不添加的话,QSharedMemory会被禁用,在tools\configure\configureapp.cpp源文件中可以看到这点
1 | if (dictionary["POSIX_IPC"] == "yes") |
由于目标平台是Linux,这里会判定成功,也就添加了QT_NO_SYSTEMSEMAPHORE和QT_NO_SHAREDMEMORY宏。
好了,开始编译
1 | mingw32-make -j |
安装前先断开Z:的挂载,然后将Z盘映射到C盘,再安装!这样Qt库就安装到本机磁盘了!
1 | subst Z: C:\ |
#编译其他Qt模块
以qtserialport模块为例
1 | set PATH=C:\ai\cross-toolchain\Linux-aarch64\bin;C:\msys64\usr\bin;%PATH% |
最后还要提醒一下,这样编译后bin目录下只有基础的qmake.exe、uic.exe和moc.exe,像其他的翻译程序之类的工具需要单独编译Windows版本的。