[英]How to cross-compile Qt6 on Linux for Windows?
我正在嘗試交叉編譯 Qt 6.2.1。 目標 - Windows,我的機器操作系統 - Linux(Mint 20.2)(均為 64 位)。 不幸的是我不能在 Windows 上編譯它,所以我必須做這個交叉編譯。
我的配置 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
在 CMake 工作結束時,我得到了這個:
CMake Warning:
Manually-specified variables were not used by the project:
QT_QMAKE_DEVICE_OPTIONS
然后,在 cmake --build 之后。 - 平行線:
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-w64-mingw32-g++”,但我不知道如何解決這個問題。
有人在 Linux 上手動為 Windows 交叉編譯 Qt6 嗎? 我在 Inte.net 上找不到任何可行的解決方案。
對於那些從谷歌來到這里有同樣問題的人。
在 Qt6 中,您需要指定 Cmake 工具鏈進行交叉編譯(我得到類似於此處共享的工具鏈的東西),因為“單獨”設備選項 CROSS_COMPILE(如我的問題中的 cmd 中)已貶值/過時(或類似的東西)。
在我的情況下,我還需要使用 CMake 工具鏈和設備選項 CROSS-COMPILE,因為在其他方面 qmake 無法找到合適的跨平台編譯器(在我的情況下為 x86_64-w64-mingw32-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)
最終./配置 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
在 cmake --build 和 cmake --install 之后,我在構建路徑中獲得了 host-qmake 腳本
$HOME/Projects/testing_qt_builds/qtbuild_with_old_params/bin/
我必須通過將.pro 文件傳遞給它來構建我的 Qt 項目。 然后我只是將.exe 文件復制到 Windows,提供所有需要的 dll 和 POOF,應用程序可以正常工作。 :D
我在 qt 論壇上的帖子遇到了同樣的問題,其中一位版主幫助我獲得了最終解決方案。
在 Linux 上交叉編譯 Qt 和 Windows 的另一種可能更簡單的方法是將 qmake 與MXE和mxedeployqt一起使用(后者相當於 windeployqt 並整理所需的 DLL)。
我有幾個項目在 Docker 中使用 MXE 和 mxedeployqt 來構建 Qt。docker 容器從源代碼構建 MXE(因為我想要一個最近的 gcc 並且它在 MXE 存儲庫中不可用)這需要很長時間,但是一旦完成,編譯 Qt 代碼就非常簡單了: docker-compose up
。
設置完成后,使用相同方法創建新項目非常簡單,因為它使用相同的Dockerfile
和構建腳本。 使用此方法的兩個示例存儲庫是ARPCalc和Digraph 。 獲得工作構建系統所需的大部分配置位於dockerfiles/winqt
文件夾中: https://github.com/abudden/digraph/blob/master/dockerfiles/winqt
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.