我想使用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-w 64-mingw 32-gcc)。如果我省略-xplatform
选项并将-platform
设置为我的目标规范(linux-win32-g++),它会调用交叉编译器,但当它发现一些Unix相关函数没有定义时会出错。
以下是我最近尝试的一些输出:http://pastebin.com/QCpKSNev。
问题:
1.当从Linux主机上交叉编译Qt for Windows之类的东西时,是否应该调用本机编译器?也就是说,在交叉编译过程中,我们不应该只使用交叉编译器吗?当我指定-xplatform
选项时,我不明白为什么Qt的configure脚本试图调用系统的本地编译器。
1.如果我使用的是mingw交叉编译器,什么时候需要处理specs文件?GCC的规范文件对我来说仍然是一个谜,所以我想知道这里的一些背景知识是否能帮助我。
1.一般来说,除了在qmake.conf中指定交叉编译器之外,还需要考虑什么?
5条答案
按热度按时间r1zhe5dt1#
使用M cross environment (MXE)。它将痛苦从整个过程中解脱出来:
注意事项:
fjnneemd2#
(This是@Tshepang的回答的更新,因为MXE在他的回答之后已经发展)
构建Qt
您可以使用
MXE_TARGETS
来控制目标机器和工具链(32位或64位),而不是使用make qt
来构建Qt。MXE开始使用.static
和.shared
作为目标名称的一部分,以显示您想要构建的lib类型。在@Tshepang的原始答案中,他没有指定
MXE_TARGETS
,而是使用默认值。在他写答案的时候,默认值是i686-pc-mingw32
,现在是i686-w64-mingw32.static
。如果将MXE_TARGETS
显式设置为i686-w64-mingw32
,而忽略.static
,则会打印一个警告,因为此语法现在已被弃用。如果您尝试将目标设置为i686-pc-mingw32
,则会显示错误,因为MXE已删除对www.example.com的支持MinGW.org(即i686-pc-mingw 32)。运行
qmake
当我们更改
MXE_TARGETS
时,<mxe root>/usr/i686-pc-mingw32/qt/bin/qmake
命令将不再起作用。现在你需要做的是如果您没有指定
MXE_TARGETS
,请执行以下操作:**更新:**新默认值为
i686-w64-mingw32.static
jhiyze9q3#
在Linux上交叉编译Windows软件的另一种方法是Archlinux上的MinGW-w 64工具链。它易于使用和维护,并提供了最新版本的编译器和许多库。我个人觉得它比MXE更容易,而且它似乎更快地采用更新版本的库。
首先,你需要一个基于arch的机器(虚拟机或Docker容器就足够了)。它不一定是Arch Linux,衍生品也可以。我用的是Manjaro Linux。大多数MinGW-w 64软件包在Arch官方仓库中不可用,但有plenty in AUR。Arch的默认包管理器(Pacman)不支持直接从AUR安装,所以你需要安装和使用AUR Package 器,如yay或yaourt。然后安装MinGW-w 64版本的Qt 5和Boost库就像以下一样简单:
这还将安装MinGW-w 64工具链(
mingw-w64-gcc
)和其他依赖项。交叉编译Windows(x64)的Qt项目就像这样简单:要部署程序,您需要从
/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字幕下载器GUI。我可以分两步做:
1.启动Docker容器:
1.克隆和编译QNapi
就这样!在很多情况下,就这么简单。将您自己的库添加到包存储库(AUR)也很简单。您需要write a PKBUILD file,这是直观的,例如,请参阅mingw-w64-rapidjson。
ou6hu8tu4#
好吧,我想我明白了。
部分基于https://github.com/mxe/mxe/blob/master/src/qt.mk和https://www.videolan.org/developers/vlc/contrib/src/qt4/rules.mak
看起来“最初”当你运行configure(使用-xtarget等)时,它配置然后运行你的“主机”gcc来构建本地二进制文件。/bin/qmake
然后你运行正常的“make”,它为mingw构建它,
所以
1.是的
1.仅当您需要使用msvcrt.dll(其默认值)以外的内容时。虽然我从来没有用过其他东西,所以我不知道肯定。
piztneat5#
为了编译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-
,它指定了我正在使用的工具链的前缀,在所有为windows构建二进制文件的makefile中,它将被前缀为'gcc'或'g'。最后,在构建idc时可能会遇到问题,这显然是用于向Qt添加ActiveX支持的东西。您可以通过将标志
-skip qtactiveqt
传递给configure脚本来避免这种情况。我从这个bug报告中得到了这个:https://bugreports.qt.io/browse/QTBUG-38223下面是我使用的整个configure命令:
至于你的问题:
1 -是的。本机编译器将被调用,以构建一些在构建过程中需要的工具。也许是qconfig或qmake之类的工具,但我不完全确定具体是哪种工具。
2 -对不起。我不知道编译器=/的上下文中的specs文件是什么。但据我所知,你不必面对这些。
3 -你可以在configure命令行中指定交叉编译器前缀,而不是在qmake.conf文件中指定,如上所述。IDC也有这个问题,我也提到过它的解决方案。