在Linux上为Windows目标配置Qt交叉编译

问题描述

我想使用Linux x86_64主机为Windows x86_64目标交叉编译Qt库(最终也包括我的应用程序)。我觉得自己已经接近成功了,但可能对整个过程有一些基本的误解。

我从在我的Fedora机器上安装所有mingw包开始,并修改了win32-g++的qmake.conf文件以适应我的环境。然而,我似乎在Qt的某些显而易见的配置选项上遇到了问题:-platform-xplatform。Qt文档说-platform应该是主机架构(你正在编译的机器),而-xplatform应该是你希望部署的目标平台。在我的情况下,我设置了-platform linux-g++-64-xplatform linux-win32-g++,其中linux-win32-g++是我修改过的win32-g++配置。

我的问题是,在使用这些选项执行配置后,我看到它调用了我系统的编译器而不是交叉编译器(x86_64-w64-mingw32-gcc)。如果我省略了-xplatform选项并将-platform设置为我的目标规范(linux-win32-g++),它会调用交叉编译器,但在发现一些与Unix相关的函数未定义时出错。

某次尝试的输出: Pastebin链接

问题

  1. 当从Linux主机为Windows交叉编译Qt时,本地编译器是否会被调用?也就是说,在交叉编译过程中,我们应该仅使用交叉编译器吗?我不明白为什么在指定-xplatform选项时,Qt的配置脚本会调用我系统的本地编译器。
  2. 如果我使用的是mingw交叉编译器,什么时候需要处理一个specs文件?GCC的specs文件对我来说仍然很神秘,我想知道一些相关背景是否会有所帮助。
  3. 一般来说,除了在我的qmake.conf中指定一个交叉编译器外,我还需要考虑什么?
答案整理
答案1:使用MXE进行交叉编译

跨平台编译Qt的一个简便方法是使用MXE(M cross environment)。步骤如下:

  1. 获取MXE:

    sh 复制代码
    git clone https://github.com/mxe/mxe.git
  2. 安装构建依赖。

  3. 构建Qt及其依赖项和交叉构建工具,这大约需要一小时:

    sh 复制代码
    cd mxe && make qt
  4. 将交叉构建工具添加到你的PATH环境变量中:

    sh 复制代码
    export PATH=<mxe root>/usr/bin:$PATH
  5. 使用qmake生成Makefile并构建:

    sh 复制代码
    <mxe root>/usr/i686-pc-mingw32/qt/bin/qmake && make
  6. 你应该能在./release目录下找到二进制文件:

    sh 复制代码
    wine release/foo.exe
答案2:使用Archlinux的MinGW-w64工具链

另一个方法是在基于Arch的系统上使用MinGW-w64工具链:

  1. 安装必要的软件包:

    sh 复制代码
    yay -Sy mingw-w64-qt5-base mingw-w64-boost
  2. 在项目目录中使用交叉编译工具进行构建:

    sh 复制代码
    x86_64-w64-mingw32-qmake-qt5
    make
  3. 部署时需要将对应的dll文件复制到你的可执行文件目录中。

注意事项
  • 在配置Qt时,如果遇到idc相关问题,添加-skip qtactiveqt参数可以跳过这些问题。
  • 在配置过程中,本地主机的编译器可能会被调用,用于构建一些必要的工具,例如qmake
sh 复制代码
cd qt_source_directory
mkdir my_build
cd my_build
../configure \
  -release \
  -opensource \
  -no-compile-examples \
  -platform linux-g++-64 \
  -xplatform win32-g++ \
  -device-option CROSS_COMPILE=/usr/bin/x86_64-w64-mingw32- \
  -skip qtactiveqt \
  -v

结论

交叉编译Qt从Linux到Windows涉及指定正确的配置参数并确保交叉编译器被正确调用。使用像MXE或Archlinux的MinGW-w64工具链能简化这个过程,避免许多潜在的问题。

相关推荐
叶北辰CHINA29 分钟前
nginx反向代理,负载均衡,HTTP配置简述(说人话)
linux·运维·nginx·http·云原生·https·负载均衡
不惑_1 小时前
在 Ubuntu 安装 Python3.7(没有弯路)
linux·运维·ubuntu
学习溢出1 小时前
深入了解 net user 命令:上一次是谁登录的?
windows·网络安全·系统安全
程序猿小D1 小时前
第二百六十七节 JPA教程 - JPA查询AND条件示例
java·开发语言·前端·数据库·windows·python·jpa
玉树临风江流儿2 小时前
Linux驱动开发(速记版)--设备模型
linux·驱动开发
杰哥在此2 小时前
Python知识点:如何使用Multiprocessing进行并行任务管理
linux·开发语言·python·面试·编程
枫叶丹44 小时前
【在Linux世界中追寻伟大的One Piece】进程信号
linux·运维·服务器
刻词梨木5 小时前
ubuntu中挂载点内存不足,分配不合理后使用软链接的注意事项
linux·运维·ubuntu
灯火不休ᝰ5 小时前
[win7] win7系统的下载及在虚拟机中详细安装过程(附有下载文件)
linux·运维·服务器
一律清风8 小时前
QT-文件创建时间修改器
c++·qt