如何在Linux下交叉编译C++程序至Windows(基于qmake、make与MXE)
用MXE在Ubuntu 16.04交叉编译C++程序到Windows 32/64位
我来帮你梳理一套完整的操作步骤,应该能解决你之前遇到的依赖库缺失问题——毕竟MXE就是用来统一管理交叉编译依赖的,只要步骤对了就不用再头疼各种库的适配问题了。
1. 先安装MXE的基础依赖
Ubuntu 16.04上需要先装好编译MXE本身的工具包,打开终端执行:
sudo apt-get update && sudo apt-get install build-essential git libtool autoconf automake pkg-config mingw-w64
2. 克隆MXE仓库并切换到兼容分支
因为Ubuntu 16.04比较老,建议用MXE的稳定分支避免兼容性问题(比如mxe-20210101这个版本,亲测在16.04上能正常编译):
git clone https://github.com/mxe/mxe.git cd mxe git checkout mxe-20210101
3. 配置并编译MXE(关键步骤)
MXE需要提前编译你程序用到的所有依赖,比如你用了Qt(因为之前用qmake),所以必须编译Qt相关模块。这里同时配置32位和64位的目标架构:
# 编译32位+64位的Qt5基础模块(qtbase是核心,qttools包含qmake等工具) make MXE_TARGETS='i686-w64-mingw32.static x86_64-w64-mingw32.static' MXE_PLUGIN_DIRS=plugins/qt5 qtbase qttools -j4
- 解释下参数:
MXE_TARGETS指定要编译的目标架构,static后缀表示编译静态链接的库,这样生成的Windows程序不需要带一堆DLL就能运行-j4是根据你的CPU核心数调整,比如4核就写-j4,加速编译(这个过程会比较久,可能要几十分钟,耐心等)
- 如果你的程序还用到其他依赖(比如OpenCV、Boost),直接在后面加上对应的包名就行,比如
qtbase qttools opencv boost
4. 交叉编译你的程序
编译完MXE后,就可以开始交叉编译你的项目了:
编译32位Windows版本
# 把MXE的工具目录加到环境变量里(替换成你实际的MXE路径) export PATH=/home/your_username/mxe/usr/bin:$PATH # 进入你的项目目录 cd /path/to/your/cpp_project # 用MXE提供的32位Qt qmake生成Makefile i686-w64-mingw32.static-qmake-qt5 # 编译 make -j4
编译64位Windows版本
和32位类似,只是换用64位的qmake:
export PATH=/home/your_username/mxe/usr/bin:$PATH cd /path/to/your/cpp_project x86_64-w64-mingw32.static-qmake-qt5 make -j4
常见问题排查
- 如果编译MXE时遇到某个依赖失败,先检查Ubuntu的依赖是否装全,或者换一个更早的MXE稳定分支
- 如果你的项目qmake配置文件(.pro)里有Ubuntu特定的设置,比如
unix:开头的语句,不用改——MXE的qmake会自动识别目标平台,忽略unix相关的配置 - 生成的Windows程序会在项目目录里,32位和64位的都是
.exe格式,直接拷贝到Windows上就能运行
内容的提问来源于stack exchange,提问作者lung bubble
相关产品推荐
相关产品推荐

