如何在Linux上交叉编译Qt6?

oyt4ldly  于 2023-01-12  发布在  Linux
关注(0)|答案(2)|浏览(614)

我尝试交叉编译Qt 6.2.1。目标- Windows,我的机器操作系统- Linux(Mint 20.2)(都是64位)。不幸的是我不能在Windows上编译它,所以我必须做这个交叉编译。
我的配置命令:

./../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

在CMake的结尾我得到了这个:

CMake Warning:
  Manually-specified variables were not used by the project:

    QT_QMAKE_DEVICE_OPTIONS

然后,在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>
      |          ^~~~~~~~~

我已经检查了(这在上面的日志中也可以看到)和CMake,由于某种原因,忽略了我的“CROSS_COMPILE”选项,并使用Linux c工具来编译,而不是“x86_64-w 64-mingw 32-g”,但我不知道如何修复。
有人在Linux上手动交叉编译Qt 6 for Windows吗?我在互联网上找不到任何有效的解决方案。

brc7rcf0

brc7rcf01#

对于那些从谷歌来这里有同样的问题。
在Qt 6中,您需要为交叉编译指定Cmake工具链(我得到了类似于工具链共享here的东西),因为“单独”设备选项CROSS_COMPILE(如我的问题中的cmd)已经贬值/过时(或类似于smth)。
在我的例子中,我还需要使用CMake工具链和设备选项CROSS-COMPILE,因为在其他方面qmake无法找到合适的跨平台编译器(在我的例子x86_64-w 64-mingw 32-g++-posix中)。要使用末尾带有“posix”的编译器,我需要修改qtbase/mkspecs/win32-g++/qmake. conf。

#
# 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)

最终/配置命令:

./../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

在cmake --build和cmake --install之后,我在构建路径中获得了host-qmake脚本
$HOME/项目/测试数量构建/使用旧参数的数量构建/bin/
我不得不使用它来建立我的Qt项目通过传递.pro文件到它。然后我只是复制.exe文件到Windows,提供所有需要的dll和POOF,应用程序的工作。:D
qt论坛上的My thread也有同样的问题,其中一个版主帮了我很大的忙才得到最终的解决方案。

euoag5mw

euoag5mw2#

在Linux上交叉编译Qt for Windows的另一种可能更简单的方法是将qmake与MXEmxedeployqt一起使用(后者相当于windeployqt,并整理所需的DLL)。
我有几个项目使用Docker中的MXE和mxedeployqt来构建Qt。Docker容器从源代码构建MXE(因为我需要一个最新的gcc,而MXE存储库中没有),这需要很长时间,但一旦完成,编译Qt代码就非常简单了:docker-compose up.
设置好后,创建一个使用相同方法的新项目非常简单,因为它使用相同的Dockerfile和构建脚本。使用此方法的两个示例存储库是ARPCalcDigraph。获得工作构建系统所需的大多数配置都在dockerfiles/winqt文件夹中:https://github.com/abudden/digraph/blob/master/dockerfiles/winqt

相关问题