首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何配置Qt以实现从Linux到Windows目标的交叉编译?

如何配置Qt以实现从Linux到Windows目标的交叉编译?
EN

Stack Overflow用户
提问于 2012-06-07 23:14:24
回答 5查看 86.1K关注 0票数 85

我希望使用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++配置。

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

这是我最近一次尝试的一些输出:http://pastebin.com/QCpKSNev

问题:

  1. 当从Linux主机交叉编译Qt for Windows之类的东西时,应该调用本机编译器吗?也就是说,在交叉编译过程中,我们不应该只使用交叉编译器吗?当我指定了-xplatform选项时,我不明白为什么Qt的配置脚本试图调用我的系统的本机编译器。
  2. 如果我使用的是mingw交叉编译器,我什么时候需要处理一个specs文件?对我来说,GCC的规范文件仍然是一个谜,所以我想知道这里的一些背景知识是否会对我有所帮助。
  3. 总的来说,除了在我的qmake.conf中指定交叉编译器之外,我还需要考虑什么?
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-11-04 01:57:12

只需使用M cross environment (MXE)即可。它消除了整个过程中的痛苦:

  • 获取它:

$ git clone https://github.com/mxe/mxe.git

  • Build Qt for Windows,它的依赖项,以及交叉构建工具;这将在具有良好互联网接入的快速机器上花费大约一个小时;下载大小约为500MB:

$ cd mxe && make qt

  • 转到应用程序所在的目录,将交叉构建工具添加到PATH环境变量中:

$ export PATH=/usr/bin:$PATH

  • Run Qt Makefile生成器工具,然后构建:

$ /usr/i686-pc-mingw32/qt/bin/qmake && make

  • 您应该可以在./

  • 目录中找到二进制文件:

$ wine release/foo.exe

一些笔记

  • 使用MXE存储库的主分支;它似乎得到了开发团队的更多喜爱。
  • 输出是32位静态二进制文件,可以在64位Windows上很好地工作。
票数 74
EN

Stack Overflow用户

发布于 2014-08-15 06:58:58

(这是@Tshepang答案的更新,因为MXE在他的答案之后发生了变化)

构建Qt

您可以使用MXE_TARGETS来控制目标计算机和工具链(32位或64位),而不是使用make qt构建Qt。MXE开始使用.static.shared作为目标名称的一部分,以显示您希望构建哪种类型的库。

代码语言:javascript
复制
# The following is the same as `make qt`, see explanation on default settings after the code block.
make qt MXE_TARGETS=i686-w64-mingw32.static   # MinGW-w64, 32-bit, static libs

# Other targets you can use:
make qt MXE_TARGETS=x86_64-w64-mingw32.static # MinGW-w64, 64-bit, static libs
make qt MXE_TARGETS=i686-w64-mingw32.shared   # MinGW-w64, 32-bit, shared libs

# You can even specify two targets, and they are built in one run:
# (And that's why it is MXE_TARGET**S**, not MXE_TARGET ;)
# MinGW-w64, both 32- and 64-bit, static libs
make qt MXE_TARGETS='i686-w64-mingw32.static x86_64-w64-mingw32.static'

在@Tshepang的原始答案中,他没有指定MXE_TARGETS,并且使用了默认值。在他写答案的时候,默认值是i686-pc-mingw32,现在是i686-w64-mingw32.static。如果将MXE_TARGETS显式设置为i686-w64-mingw32,忽略.static,则会打印一条警告,因为此语法现在已弃用。如果您尝试将目标设置为i686-pc-mingw32,它将显示一个错误,因为MXE已删除对MinGW.org的支持(即i686-pc-mingw32)。

运行qmake

由于我们更改了MXE_TARGETS<mxe root>/usr/i686-pc-mingw32/qt/bin/qmake命令将不再起作用。现在,你需要做的是:

代码语言:javascript
复制
<mxe root>/usr/<TARGET>/qt/bin/qmake

如果未指定MXE_TARGETS,请执行以下操作:

代码语言:javascript
复制
<mxe root>/usr/i686-w64-mingw32.static/qt/bin/qmake

更新:现在新默认值为i686-w64-mingw32.static

票数 17
EN

Stack Overflow用户

发布于 2018-01-27 03:08:13

在Linux上交叉编译Windows软件的另一种方法是Archlinux上的MinGW-w64工具链。它易于使用和维护,并且提供了最新版本的编译器和许多库。我个人发现它比MXE更容易,而且它似乎更快地采用更新版本的库。

首先,您需要一台基于arch的机器(虚拟机或docker容器就足够了)。它不一定非得是Arch Linux,衍生品也可以。我使用的是Manjaro Linux。大多数MinGW-w64包在官方的Arch存储库中都不可用,但有plenty in AUR。Arch (Pacman)的默认包管理器不支持直接从AUR安装,因此您需要安装和使用AUR包装器,如yay或yaourt。然后,安装MinGW-w64版本的Qt5和Boost库就像下面这样简单:

代码语言:javascript
复制
yay -Sy mingw-w64-qt5-base mingw-w64-boost
#yaourt -Sy mingw-w64-qt5-base mingw-w64-qt5-boost #if you use yaourt

这还将安装MinGW-w64工具链(mingw-w64-gcc)和其他依赖项。然后,交叉编译windows的Qt项目(x64)就像下面这样简单:

代码语言:javascript
复制
x86_64-w64-mingw32-qmake-qt5
make

要部署您的程序,您需要从/usr/x86_64-w64-mingw32/bin/复制corresponding dlls。例如,您通常需要将/usr/x86_64-w64-mingw32/lib/qt/plugins/platforms/qwindows.dll复制到program.exe_dir/platforms/qwindows.dll

要获得32位版本,只需使用i686-w64-mingw32-qmake-qt5即可。基于Cmake的项目可以很容易地与x86_64-w64-mingw32-cmake一起使用。这种方法对我来说工作得非常好,是最容易设置、维护和扩展的。它也适用于持续集成服务。也有可用的docker images

例如,假设我想构建QNapi字幕下载器图形用户界面。我可以分两步完成:

  1. 启动docker容器:

代码语言:javascript
复制
sudo docker run -it burningdaylight/mingw-arch:qt /bin/bash

  1. 克隆和编译QNapi

代码语言:javascript
复制
git clone --recursive 'https://github.com/QNapi/qnapi.git' 
cd qnapi/ 
x86_64-w64-mingw32-qmake-qt5
make

就这样!在许多情况下,这将是那么简单。将您自己的库添加到包存储库(AUR)也很简单。您需要write a PKBUILD file,这是最直观的,例如,请参见mingw-w64-rapidjson

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10934683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档