[英]How to cross-compile Qt6 on Linux for Windows?
I'm trying to cross-compile Qt 6.2.1.我正在尝试交叉编译 Qt 6.2.1。 Target - Windows, my machine OS - Linux (Mint 20.2) (both 64bit).
目标 - Windows,我的机器操作系统 - Linux(Mint 20.2)(均为 64 位)。 Unfortunately I can't compile it on Windows, so I have to do this cross-compilation.
不幸的是我不能在 Windows 上编译它,所以我必须做这个交叉编译。
My configure cmd:我的配置 cmd:
./../qt-everywhere-src-6.2.1/configure -prefix $PWD/. -platform linux-gcc-64 -xplatform win32-g++ -device-option CROSS_COMPILE=/usr/bin/x86_64-w64-mingw32- -opensource -opengl desktop -qt-host-path /home/papoj/Projects/host_qtbuild
At the end of CMake work I'm getting this:在 CMake 工作结束时,我得到了这个:
CMake Warning:
Manually-specified variables were not used by the project:
QT_QMAKE_DEVICE_OPTIONS
And then, after cmake --build.然后,在 cmake --build 之后。 --parallel:
- 平行线:
FAILED: qtbase/src/tools/bootstrap/CMakeFiles/Bootstrap.dir/__/__/corelib/global/qglobal.cpp.o
/usr/bin/c++ -DHAVE_CONFIG_H -DQT_BOOTSTRAPPED -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_NO_DEBUG -DQT_NO_FOREACH -DQT_USE_QSTRINGBUILDER -DQT_VERSION_MAJOR=6 -DQT_VERSION_MINOR=2 -DQT_VERSION_PATCH=1 -DQT_VERSION_STR=\"6.2.1\" -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -I/home/papoj/Projects/qtbuild/qtbase/src/corelib/Core_autogen/include -I/home/papoj/Projects/qtbuild/qtbase/include -I/home/papoj/Projects/qtbuild/qtbase/include/QtCore -I/home/papoj/Projects/qt-everywhere-src-6.2.1/qtbase/src/corelib -I/home/papoj/Projects/qtbuild/qtbase/src/corelib -I/home/papoj/Projects/qtbuild/qtbase/src/corelib/global -I/home/papoj/Projects/qtbuild/qtbase/src/corelib/kernel -I/home/papoj/Projects/qt-everywhere-src-6.2.1/qtbase/src/corelib/../3rdparty/tinycbor/src -I/home/papoj/Projects/qtbuild/qtbase/include/QtCore/6.2.1 -I/home/papoj/Projects/qtbuild/qtbase/include/QtCore/6.2.1/QtCore -I/home/papoj/Projects/qt-everywhere-src-6.2.1/qtbase/src/corelib/../3rdparty/double-conversion/double-conversion -I/home/papoj/Projects/qt-everywhere-src-6.2.1/qtbase/src/corelib/../3rdparty/double-conversion -I/home/papoj/Projects/qt-everywhere-src-6.2.1/qtbase/src/corelib/../3rdparty/forkfd -I/home/papoj/Projects/qtbuild/qtbase/src/corelib/.rcc -I/home/papoj/Projects/qt-everywhere-src-6.2.1/qtbase/mkspecs/win32-g++ -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/home/papoj/Projects/qtbuild/qtbase/src/xml/Xml_autogen/include -I/home/papoj/Projects/qtbuild/qtbase/include/QtXml -I/home/papoj/Projects/qt-everywhere-src-6.2.1/qtbase/src/xml -I/home/papoj/Projects/qtbuild/qtbase/src/xml -I/home/papoj/Projects/qtbuild/qtbase/include/QtXml/6.2.1 -I/home/papoj/Projects/qtbuild/qtbase/include/QtXml/6.2.1/QtXml -I/home/papoj/Projects/qt-everywhere-src-6.2.1/qtbase/src/tools/bootstrap/.. -I/home/papoj/Projects/qt-everywhere-src-6.2.1/qtbase/src/tools/bootstrap/../../3rdparty/tinycbor/src -DNDEBUG -O2 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wextra -ffunction-sections -fdata-sections -mshstk -Wsuggest-override -std=gnu++17 -MD -MT qtbase/src/tools/bootstrap/CMakeFiles/Bootstrap.dir/__/__/corelib/global/qglobal.cpp.o -MF qtbase/src/tools/bootstrap/CMakeFiles/Bootstrap.dir/__/__/corelib/global/qglobal.cpp.o.d -o qtbase/src/tools/bootstrap/CMakeFiles/Bootstrap.dir/__/__/corelib/global/qglobal.cpp.o -c /home/papoj/Projects/qt-everywhere-src-6.2.1/qtbase/src/corelib/global/qglobal.cpp
In file included from /home/papoj/Projects/qt-everywhere-src-6.2.1/qtbase/src/corelib/global/qglobal.cpp:41:
/home/papoj/Projects/qt-everywhere-src-6.2.1/qtbase/mkspecs/win32-g++/qplatformdefs.h:55:10: fatal error: tchar.h: No such file or directory
55 | #include <tchar.h>
| ^~~~~~~~~
I have checked (this is also visible in log above) and CMake, for some reason, ignore my "CROSS_COMPILE" option and uses Linux c++ tool to compile instead of 'x86_64-w64-mingw32-g++', but I dont know how to fix that.我检查过(这在上面的日志中也可见)和 CMake,出于某种原因,忽略我的“CROSS_COMPILE”选项并使用 Linux c++ 工具编译而不是“x86_64-w64-mingw32-g++”,但我不知道如何解决这个问题。
Does anybody cross-compiled Qt6 for Windows on Linux manually?有人在 Linux 上手动为 Windows 交叉编译 Qt6 吗? I cannot find any working solution on the Inte.net.
我在 Inte.net 上找不到任何可行的解决方案。
For those coming here from google with same problem.对于那些从谷歌来到这里有同样问题的人。
In Qt6 you need to specify Cmake toolchain for cross-compilation (I get something similar to toolchain shared here ), as 'alone' device-option CROSS_COMPILE (as in cmd from my question) is depreciated/outdated (or smth like that).在 Qt6 中,您需要指定 Cmake 工具链进行交叉编译(我得到类似于此处共享的工具链的东西),因为“单独”设备选项 CROSS_COMPILE(如我的问题中的 cmd 中)已贬值/过时(或类似的东西)。
In my case I needed to use CMake toolchain and device-option CROSS-COMPILE as well, because in other way qmake was not able to find proper cross-platform compiler (in my case x86_64-w64-mingw32-g++-posix).在我的情况下,我还需要使用 CMake 工具链和设备选项 CROSS-COMPILE,因为在其他方面 qmake 无法找到合适的跨平台编译器(在我的情况下为 x86_64-w64-mingw32-g++-posix)。 To use compiler with "posix" at the end I needed to modify qtbase/mkspecs/win32-g++/qmake.conf.
要在最后使用带有“posix”的编译器,我需要修改 qtbase/mkspecs/win32-g++/qmake.conf。 This is how it looks like after changes:
这是更改后的样子:
#
# qmake configuration for win32-g++
#
# Written for MinGW-w64 / gcc 5.3 or higher
#
# Cross compile example for i686-w64-mingw32-g++:
# configure -xplatform win32-g++ -device-option CROSS_COMPILE=i686-w64-mingw32-
#
include(../common/g++-win32.conf)
include(../common/windows-desktop.conf)
# modifications to g++-win32.conf
QMAKE_CC = $${CROSS_COMPILE}gcc-posix
QMAKE_CFLAGS += -fno-keep-inline-dllexport
QMAKE_CFLAGS_WARN_ON += -Wextra
QMAKE_CXX = $${CROSS_COMPILE}g++-posix
QMAKE_CXXFLAGS += -fno-keep-inline-dllexport
QMAKE_CXXFLAGS_WARN_ON = $$QMAKE_CFLAGS_WARN_ON
QMAKE_CXXFLAGS_EXCEPTIONS_ON += -mthreads
QMAKE_LINK = $${CROSS_COMPILE}g++-posix
QMAKE_LINK_C = $${CROSS_COMPILE}gcc-posix
QMAKE_CFLAGS_LTCG = -flto
QMAKE_CXXFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG
QMAKE_LFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG
QMAKE_LFLAGS_EXCEPTIONS_ON += -mthreads
load(qt_config)
Final./configure cmd:最终./配置 cmd:
./../qt-everywhere-src-6.2.1/configure -prefix $HOME/Projects/testing_qt_builds/qtbuild_with_old_params -platform linux-g++ -xplatform win32-g++ -device-option CROSS_COMPILE=/usr/bin/x86_64-w64-mingw32- -opensource -opengl desktop -qt-host-path $HOME/Qt/6.2.1/gcc_64 -nomake tests -nomake examples -skip qtwebengine -- -DQT_BUILD_TOOLS_WHEN_CROSSCOMPILING=ON -DCMAKE_TOOLCHAIN_FILE=$HOME/Projects/toolchain.cmake
After cmake --build and cmake --install I got host-qmake script in my build path在 cmake --build 和 cmake --install 之后,我在构建路径中获得了 host-qmake 脚本
$HOME/Projects/testing_qt_builds/qtbuild_with_old_params/bin/
$HOME/Projects/testing_qt_builds/qtbuild_with_old_params/bin/
Which I had to use to build my Qt project by passing.pro file to it.我必须通过将.pro 文件传递给它来构建我的 Qt 项目。 And then I just copied.exe file to Windows, provided all needed dlls and POOF, app works.
然后我只是将.exe 文件复制到 Windows,提供所有需要的 dll 和 POOF,应用程序可以正常工作。 :D
:D
My thread on qt forum with same problem where one of moderators helped me a lot to get final solution. 我在 qt 论坛上的帖子遇到了同样的问题,其中一位版主帮助我获得了最终解决方案。
Another, possibly simpler approach to cross-compiling Qt for Windows on Linux is to use qmake with MXE and mxedeployqt (the latter is the equivalent of windeployqt and collates the required DLLs).在 Linux 上交叉编译 Qt 和 Windows 的另一种可能更简单的方法是将 qmake 与MXE和mxedeployqt一起使用(后者相当于 windeployqt 并整理所需的 DLL)。
I've got a couple of projects that use MXE and mxedeployqt within Docker to build Qt. The docker container builds MXE from source (because I wanted a recent gcc and it wasn't available in the MXE repositories) which takes a long time, but once that's done, compiling Qt code is very straightforward: docker-compose up
.我有几个项目在 Docker 中使用 MXE 和 mxedeployqt 来构建 Qt。docker 容器从源代码构建 MXE(因为我想要一个最近的 gcc 并且它在 MXE 存储库中不可用)这需要很长时间,但是一旦完成,编译 Qt 代码就非常简单了:
docker-compose up
。
Once set up, creating a new project that uses the same method is very simple as it uses the same Dockerfile
and build script.设置完成后,使用相同方法创建新项目非常简单,因为它使用相同的
Dockerfile
和构建脚本。 Two example repositories that use this method are ARPCalc and Digraph .使用此方法的两个示例存储库是ARPCalc和Digraph 。 Most of the configuration required to get a working build system is in the
dockerfiles/winqt
folder: https://github.com/abudden/digraph/blob/master/dockerfiles/winqt获得工作构建系统所需的大部分配置位于
dockerfiles/winqt
文件夹中: https://github.com/abudden/digraph/blob/master/dockerfiles/winqt
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.