我希望使用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。
问题:
-xplatform
选项时,我不明白为什么Qt的配置脚本试图调用我的系统的本机编译器。发布于 2012-11-04 01:57:12
只需使用M cross environment (MXE)即可。它消除了整个过程中的痛苦:
$ git clone https://github.com/mxe/mxe.git
$ cd mxe && make qt
$ export PATH=/usr/bin:$PATH
$ /usr/i686-pc-mingw32/qt/bin/qmake && make
$ wine release/foo.exe
一些笔记
发布于 2014-08-15 06:58:58
(这是@Tshepang答案的更新,因为MXE在他的答案之后发生了变化)
构建Qt
您可以使用MXE_TARGETS
来控制目标计算机和工具链(32位或64位),而不是使用make qt
构建Qt。MXE开始使用.static
和.shared
作为目标名称的一部分,以显示您希望构建哪种类型的库。
# 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
命令将不再起作用。现在,你需要做的是:
<mxe root>/usr/<TARGET>/qt/bin/qmake
如果未指定MXE_TARGETS
,请执行以下操作:
<mxe root>/usr/i686-w64-mingw32.static/qt/bin/qmake
更新:现在新默认值为i686-w64-mingw32.static
发布于 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库就像下面这样简单:
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)就像下面这样简单:
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字幕下载器图形用户界面。我可以分两步完成:
sudo docker run -it burningdaylight/mingw-arch:qt /bin/bash
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。
https://stackoverflow.com/questions/10934683
复制相似问题