在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工具链能简化这个过程,避免许多潜在的问题。

相关推荐
矛取矛求5 分钟前
Linux系统性能调优技巧
linux
One_Blanks9 分钟前
渗透测试-Linux基础(1)
linux·运维·安全
Perishell10 分钟前
无人机避障——大疆与Airsim中的角速度信息订阅获取
linux·动态规划·无人机
爱吃喵的鲤鱼13 分钟前
linux进程的状态之环境变量
linux·运维·服务器·开发语言·c++
dessler25 分钟前
Linux系统-ubuntu系统安装
linux·运维·云计算
7年老菜鸡41 分钟前
策略模式(C++)三分钟读懂
c++·qt·策略模式
荒Huang1 小时前
Linux挖矿病毒(kswapd0进程使cpu爆满)
linux·运维·服务器
零意@1 小时前
ubuntu切换不同版本的python
windows·python·ubuntu
hjjdebug3 小时前
linux 下 signal() 函数的用法,信号类型在哪里定义的?
linux·signal
其乐无涯3 小时前
服务器技术(一)--Linux基础入门
linux·运维·服务器