我想跨编译使用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的克++是我的改性Win32的克++结构。
我的问题是,执行与这些选项的配置之后,我看到它调用我的系统的编译器,而不是交叉编译器(x86_64的-W64-的mingw32-GCC)。 如果我省略了-xplatform
选项,并设置-platform
我的目标规格(Linux的Win32的G ++),它调用交叉编译器,但随后的错误时,发现一些Unix相关的功能都没有定义。
这里是我的最新尝试一些输出: http://pastebin.com/QCpKSNev 。
问题:
从Linux主机时,交叉编译类似的Qt适用于Windows,应在本地编译器曾经被调用? 也就是说,期间的横编译过程中,我们不应该只使用交叉编译器? 我不明白为什么Qt的配置脚本试图调用我的系统的本地编译器,当我指定-xplatform
选项。
如果我使用的MinGW交叉编译器,我什么时候将不得不面对一个规范文件? 对于GCC规格文件还有几分神秘的给我,所以我想,如果这里的一些背景会帮助我。
在一般情况下,超出了我的qmake.conf指定交叉编译器,还有什么可能我需要考虑?
只要使用中号的交叉环境(MXE) 。 它采用了痛苦的全过程:
得到它:
$ git clone https://github.com/mxe/mxe.git
安装编译依赖
构建的Qt适用于Windows,它的依赖,和交叉编译工具; 这将需要大约一个快速的机器体面的互联网接入上一个小时; 下载约500MB:
$ cd mxe && make qt
转到您的应用程序的目录,并添加交叉编译工具到PATH环境变量:
$ export PATH=<mxe root>/usr/bin:$PATH
运行Qt的Makefile生成工具,然后构建:
$ <mxe root>/usr/i686-pc-mingw32/qt/bin/qmake && make
你会发现在./release目录的二进制文件:
$ wine release/foo.exe
一些注意事项 :
(这是@ Tshepang的回答的更新,如MXE,因为他的答案演变)
构建Qt
而不是使用make qt
构建Qt的,你可以使用MXE_TARGETS
控制目标机器和工具链(32位或64位)。 MXE开始使用.static
和.shared
作为目标名称,以显示你想建立哪种类型的lib中的一部分。
# 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
好吧,我想我已经想通了。
部分基于https://github.com/mxe/mxe/blob/master/src/qt.mk和https://www.videolan.org/developers/vlc/contrib/src/qt4/rules.mak
看来,“最初”当您运行配置(与-xtarget等),其配置然后运行你的“主人”海湾合作委员会建立本地二进制文件./bin/qmake
./configure -xplatform win32-g++ -device-option CROSS_COMPILE=$cross_prefix_here -nomake examples ...
然后运行正常的“制造”,并建立它的MinGW
make
make install
所以
是
只有当你需要使用比MSVCRT.DLL(其默认值)以外的东西。 虽然我从来没有用过别的,所以我不知道某些。
https://stackoverflow.com/a/18792925/32453列出了一些配置PARAMS。
为了编译Qt中,一个必须运行它的configure
脚本,指定主机平台-platform
(如-platform linux-g++-64
如果你正在建设一个64位的Linux与G ++编译器)和目标平台-xplatform
(如-xplatform win32-g++
,如果你是交叉编译到Windows)。
:我还添加了这个标志-device-option CROSS_COMPILE=/usr/bin/x86_64-w64-mingw32-
在指定我使用的工具链,这将得到前缀为“海湾合作委员会”或前缀“G ++”所有正在建设的二进制文件的Windows makefile文件。
最后,你可能会同时建设得到问题的ICD ,这显然是一些用于支持ActiveX控件添加到Qt的。 您可以通过传递标志避免-skip qtactiveqt
的配置脚本。 我有这个错误报告的这一个: https://bugreports.qt.io/browse/QTBUG-38223
下面是我用了整个configure命令:
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
至于YOUT问题:
1 - 是的。 本地编译器会以构建需要在构建过程中的一些工具来调用。 也许事情就像qconfig或QMAKE,但我不哪些工具完全肯定的,没错。
2 - 对不起。 我不知道是什么规格的文件是在编译器= /上下文。 但据我所知,你就不必面对这一切。
3 - 您可以指定在configure命令行的交叉编译器的前缀,而不是在qmake.conf文件做的,如上所述。 还有还有IDC公司,其解决方法我已经提到的,以及这个问题。
另一种方法是交叉编译的Windows软件在Linux上的Archlinux MinGW的-W64工具链。 这是很容易使用和维护,并提供编译器和许多图书馆的最新版本。 我个人觉得比MXE容易,它似乎采取的库的更新速度更快。
首先,你需要一个基于拱机(虚拟机或码头集装箱就足够了)。 它不必是Arch Linux的,衍生品也将这样做。 我用Manjaro Linux操作系统。 大多数的MinGW-W64包不提供官方的拱门库,但有很多在AUR 。 拱(吃豆子)默认的软件包管理器不从AUR直接支持安装,所以你需要安装和使用AUR包装像pacaur或yaourt。 然后安装QT5的的MinGW-W64版本和Boost库是一样简单:
pacaur -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(x64)的Qt的项目是如此的简单:
x86_64-w64-mingw32-qmake-qt5
make
要部署你的程序,你需要相应的dll从复制/usr/x86_64-w64-mingw32/bin/
。
为了让您只需要使用一个32位版本i686-w64-mingw32-qmake-qt5
代替。 基于CMake的项目工作,只是简单x86_64-w64-mingw32-cmake
。 这种方法的工作非常出色对我来说,是最容易建立,维护和扩展。 它还与持续集成服务顺利。 有搬运工人图像可用了。
例如,假设我想建立QNapi字幕下载GUI。 我可以做的两个步骤:
1)启动搬运工容器:
sudo docker run -it burningdaylight/docker-mingw-qt5 /bin/bash
2)克隆并编译QNapi
git clone --recursive 'https://github.com/QNapi/qnapi.git'
cd qnapi/
x86_64-w64-mingw32-qmake-qt5
make
而已! 在许多情况下,这将是很容易。 将你自己的库包库(AUR)也很简单。 您将需要编写一个PKBUILD文件 ,这是直观的,因为它可以得到的,看到的MinGW-W64-rapidjson ,例如。