简体   繁体   English

Qt6 on Linux for Windows如何交叉编译?

[英]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 与MXEmxedeployqt一起使用(后者相当于 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 .使用此方法的两个示例存储库是ARPCalcDigraph 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.

相关问题 在Linux上使用GCC交叉编译Windows的Qt应用程序 - Use GCC on Linux to cross-compile Qt apps for Windows C++:如何从Windows交叉编译到Linux? - C++: How to cross-compile from Windows to Linux? 如何从Linux for Windows交叉编译SDL 2 - How to cross-compile with SDL 2 from Linux for Windows 有没有一种从 Linux 安装交叉编译 SFML 的好方法 - Is there a good way to cross-compile SFML for windows from a Linux install 使用 VS Code 在 Linux 上使用 MinGW 交叉编译适用于 Windows 的 SDL 程序? - Cross-compile SDL programs for Windows with MinGW on Linux in VS Code? 如何在 Windows 上使用 Eclipse 交叉编译树莓派 - How to Cross-Compile Raspberry Pi using Eclipse on Windows Windows编译.o但不编译.a的Boost for GCC ARM(Linux)的交叉编译。 - Cross-Compile of Boost for GCC ARM (Linux) from Windows building .o but not .a 是否可以从 Linux 为 Windows XP 交叉编译 C++ 应用程序? - Is it possible to cross-compile C++ applications from Linux for Windows XP? 使用Qt Creator交叉编译Qt应用程序的简便方法? - Easy way to cross-compile a Qt application using Qt Creator? 如何将我正在交叉编译的程序的ubuntu上的GLEW交叉编译到Windows? - How can I cross-compile GLEW on ubuntu to windows for a program I am cross-compiling?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM