如何配置Qt以进行从Linux到Windows目标的交叉编译?

i2byvkas  于 2023-10-16  发布在  Linux
关注(0)|答案(5)|浏览(248)

我想使用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中指定交叉编译器之外,还需要考虑什么?

r1zhe5dt

r1zhe5dt1#

使用M cross environment (MXE)。它将痛苦从整个过程中解脱出来:

  • 了解详情:
$ git clone https://github.com/mxe/mxe.git
  • 安装生成依赖项
  • Build Qt for Windows,它的依赖项和交叉构建工具;这将需要大约一个小时的快速机器与体面的互联网接入;下载大约500 MB:
$ 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

注意事项

  • 使用MXE存储库的主分支;它似乎得到了开发团队更多的喜爱。
  • 输出是一个32位静态二进制文件,在64位Windows上运行良好。
fjnneemd

fjnneemd2#

(This是@Tshepang的回答的更新,因为MXE在他的回答之后已经发展)

构建Qt

您可以使用MXE_TARGETS来控制目标机器和工具链(32位或64位),而不是使用make qt来构建Qt。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已删除对www.example.com的支持MinGW.org(即i686-pc-mingw 32)。

运行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

jhiyze9q

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库就像以下一样简单:

yay -Sy mingw-w64-qt5-base mingw-w64-boost
#yaourt -Sy mingw-w64-qt5-base mingw-w64-qt5-boost #if you use yaourt

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

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字幕下载器GUI。我可以分两步做:
1.启动Docker容器:

sudo docker run -it burningdaylight/mingw-arch:qt /bin/bash

1.克隆和编译QNapi

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

ou6hu8tu

ou6hu8tu4#

好吧,我想我明白了。
部分基于https://github.com/mxe/mxe/blob/master/src/qt.mkhttps://www.videolan.org/developers/vlc/contrib/src/qt4/rules.mak
看起来“最初”当你运行configure(使用-xtarget等)时,它配置然后运行你的“主机”gcc来构建本地二进制文件。/bin/qmake

./configure -xplatform win32-g++ -device-option CROSS_COMPILE=$cross_prefix_here -nomake examples ...

然后你运行正常的“make”,它为mingw构建它,

make
  make install

所以
1.是的
1.仅当您需要使用msvcrt.dll(其默认值)以外的内容时。虽然我从来没有用过其他东西,所以我不知道肯定。

  1. https://stackoverflow.com/a/18792925/32453列出了一些配置参数。
piztneat

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命令:

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

至于你的问题:
1 -是的。本机编译器将被调用,以构建一些在构建过程中需要的工具。也许是qconfig或qmake之类的工具,但我不完全确定具体是哪种工具。
2 -对不起。我不知道编译器=/的上下文中的specs文件是什么。但据我所知,你不必面对这些。
3 -你可以在configure命令行中指定交叉编译器前缀,而不是在qmake.conf文件中指定,如上所述。IDC也有这个问题,我也提到过它的解决方案。

相关问题