【问题标题】:Building a truly, fully static Qt 5 framework and application (post Qt 5.8)构建一个真正的、完全静态的 Qt 5 框架和应用程序(Qt 5.8 之后)
【发布时间】:2017-07-30 11:57:57
【问题描述】:

正如标题所示,我们的目标是成功构建 Qt 框架和 Qt 应用程序,以生成没有外部依赖的单个可执行二进制文件。

我的动机是,自从构建系统在 Qt 5.8 中得到“改进”后,我就无法真正完成成功的静态 Qt 构建。甚至在此之前,虽然构建静态 Qt 框架很容易,但它并没有真正生成没有外部依赖关系的可执行二进制文件。还有很多库需要捆绑,只有 Qt 库是静态链接的。

回到 Qt 5.8 之前的日子,我能够通过以下配置获得成功的静态 Qt 构建:

configure -c++std c++11 -prefix E:\Qt\Qt58s -platform win32-g++ -release -opensource -static -qt-zlib -qt-libpng -qt-libjpeg -qt-freetype -no-compile-examples -no-icu -opengl desktop -skip qtscript -nomake 示例 -nomake 测试 -skip qtwayland -skip qtwebview -skip qtwebengine -skip qtwebchannel -no-qml-debug -confirm-license -L E:\msys64\mingw64\lib -qt-sql-psql -qt-sql-mysql -l mysqlclient -I E:\msys64\mingw64\include\mariadb

总结一下配置,它仅限于发布版本,省略任何平台提供的库并选择使用 Qt 捆绑的库。删除 icu 作为二进制膨胀的重要来源,以及缩短构建时间的测试和示例,以及不使用 GCC 构建的 Web 引擎。此外,配置选择包括 postgres 和 mysql 驱动程序支持,后者通过 mariadb 客户端库。

这个构建配置对于 Qt 5 的几个次要版本总是成功的,但它从未真正生成无依赖关系的可执行文件。我仍然必须在 PRO 文件中手动链接 psql 和 mysql 库,而且我仍然必须至少包含 gcc 运行时库。

虽然通过将QMAKE_LFLAGS += -static-libgcc -static-libstdc++ 添加到 PRO 文件来静态链接运行时库已被证明是成功的,但这仅处理那些特定的库。

在“大规模”上,通过QMAKE_LFLAGS += -static 添加静态链接器标志从未成功构建,而是导致链接错误和内部链接到相同库的不同库之间的冲突。

但话又说回来,Qt 5.8 出现了,它重新设计了构建系统配置以改进它。和许多“改进”it actually came in broken 一样,没有可行的方法在配置中选择第三方库,而不得不手动破解各种 JSON 配置文件。

从那时起,该错误已得到修复,这使我继续努力创建一个完全静态的 Qt 构建。现在使用以下配置:

配置-prefix E:\Qt\Qt591s -c++std c++11 -platform win32-g++ -release -opensource -static -static-runtime -qt-zlib -qt-libpng -qt-libjpeg -qt-freetype -no-compile-examples -no-icu -opengl desktop -skip qtscript -nomake examples -nomake tests -skip qtwayland -skip qtwebview -skip qtwebengine -skip qtwebchannel -no-qml-debug -confirm-license -sql-psql -sql-mysql MYSQL_INCDIR=E:\msys64\mingw64\include\mariadb MYSQL_LIBDIR=E:\msys64\mingw64\lib MYSQL_LIBS="-l mysqlclient" -L E:\msys64\mingw64\lib

不同之处在于使用新语法来指定第 3 方库,并添加 -static-runtime 标志。后来turned out to be the cause of a config fail,因为mysql无法解决间接依赖关系,据称如果明确包含整个依赖关系树,这应该可以工作。

渴望获得一个有效的构建,我只是省略了-static-runtime,事实上,我终于得到了一个有效的配置。但我还没到那里,因为构建失败了,没有有意义的输出来说明原因。

下一步是尝试通过使用 -silent 配置标志来限制编译输出,不幸的是,这导致编译过程中的构建失败 5 秒,revealing a long standing bug 阻止了该标志与 GCC 一起使用,无论您是构建 Qt 还是 Qt 应用程序。

接下来我尝试使用单线程进行构建,希望减少输出混乱,甚至可能对构建失败的原因有所了解。唉,无济于事。我能从输出中得到的只是构建在 libjpg 步骤失败。这促使我删除了所有指定使用捆绑库的标志,这让我通过了 libjpg,只是在平台插件上构建失败,而对原因的了解也很少。

作为最后的手段,我尝试删除大部分可能有问题的配置标志,包括静态构建,希望至少获得一个成功的“常规构建,但也失败了:

配置 -prefix E:\Qt\ Qt591test -c++std c++11 -platform win32-g++ -release -opensource -no-compile-examples -no-icu -opengl desktop -skip qtscript -nomake examples -nomake tests -skip qtwayland -skip qtwebview -skip qtwebengine -skip qtwebchannel -no-qml-debug -confirm-license

留下以下输出:

        g++ -fno-keep-inline-dllexport -pipe -O2 -std=c++11 -fno-exceptions -Wex
tra -Wall -W -Wvla -Wdate-time -Wshift-overflow=2 -Wduplicated-cond -dM -E -o .m
oc\release\moc_predefs.h e:\share\qt-everywhere-opensource-src-5.9.1\qtbase\mksp
ecs\features\data\dummy.cpp
        g++ -c -fno-keep-inline-dllexport -pipe -O2 -std=c++11 -fno-exceptions -
Wextra -Wall -W -Wvla -Wdate-time -Wshift-overflow=2 -Wduplicated-cond -DUNICODE
 -DQT_NO_CAST_FROM_ASCII -DLIBEGL_NAME=libEGL -DLIBGLESV2_NAME=libGLESv2 -DQT_NO
_NARROWING_CONVERSIONS_IN_CONNECT -DQT_NO_EXCEPTIONS -DQT_NO_DEBUG -DQT_PLUGIN -
DQT_EVENTDISPATCHER_SUPPORT_LIB -DQT_ACCESSIBILITY_SUPPORT_LIB -DQT_FONTDATABASE
_SUPPORT_LIB -DQT_THEME_SUPPORT_LIB -DQT_GUI_LIB -DQT_CORE_LIB -IE:\share\qt-eve
rywhere-opensource-src-5.9.1\qtbase\src\plugins\platforms\direct2d -I. -IE:\shar
e\qt-everywhere-opensource-src-5.9.1\qtbase\src\plugins\platforms\windows -IE:\s
hare\qt-everywhere-opensource-src-5.9.1\qtbase\src\3rdparty\wintab -IE:\share\qt
-everywhere-opensource-src-5.9.1\qtbase\include -IE:\share\qt-everywhere-opensou
rce-src-5.9.1\qtbase\include\QtEventDispatcherSupport -IE:\share\qt-everywhere-o
pensource-src-5.9.1\qtbase\include\QtEventDispatcherSupport\5.9.1 -IE:\share\qt-
everywhere-opensource-src-5.9.1\qtbase\include\QtEventDispatcherSupport\5.9.1\Qt
EventDispatcherSupport -I..\..\..\..\include -I..\..\..\..\include\QtEventDispat
cherSupport -IE:\share\qt-everywhere-opensource-src-5.9.1\qtbase\include\QtAcces
sibilitySupport -IE:\share\qt-everywhere-opensource-src-5.9.1\qtbase\include\QtA
ccessibilitySupport\5.9.1 -IE:\share\qt-everywhere-opensource-src-5.9.1\qtbase\i
nclude\QtAccessibilitySupport\5.9.1\QtAccessibilitySupport -I..\..\..\..\include
\QtAccessibilitySupport -IE:\share\qt-everywhere-opensource-src-5.9.1\qtbase\inc
lude\QtFontDatabaseSupport -IE:\share\qt-everywhere-opensource-src-5.9.1\qtbase\
include\QtFontDatabaseSupport\5.9.1 -IE:\share\qt-everywhere-opensource-src-5.9.
1\qtbase\include\QtFontDatabaseSupport\5.9.1\QtFontDatabaseSupport -I..\..\..\..
\include\QtFontDatabaseSupport -IE:\share\qt-everywhere-opensource-src-5.9.1\qtb
ase\include\QtThemeSupport -IE:\share\qt-everywhere-opensource-src-5.9.1\qtbase\
include\QtThemeSupport\5.9.1 -IE:\share\qt-everywhere-opensource-src-5.9.1\qtbas
e\include\QtThemeSupport\5.9.1\QtThemeSupport -I..\..\..\..\include\QtThemeSuppo
rt -IE:\share\qt-everywhere-opensource-src-5.9.1\qtbase\include\QtGui\5.9.1 -IE:
\share\qt-everywhere-opensource-src-5.9.1\qtbase\include\QtGui\5.9.1\QtGui -I..\
..\..\..\include\QtGui\5.9.1 -I..\..\..\..\include\QtGui\5.9.1\QtGui -IE:\share\
qt-everywhere-opensource-src-5.9.1\qtbase\include\QtGui -I..\..\..\..\include\Qt
Gui -IE:\share\qt-everywhere-opensource-src-5.9.1\qtbase\include\QtCore\5.9.1 -I
E:\share\qt-everywhere-opensource-src-5.9.1\qtbase\include\QtCore\5.9.1\QtCore -
I..\..\..\..\include\QtCore\5.9.1 -I..\..\..\..\include\QtCore\5.9.1\QtCore -IE:
\share\qt-everywhere-opensource-src-5.9.1\qtbase\include\QtCore -I..\..\..\..\in
clude\QtCore -I.moc\release -IE:\share\qt-everywhere-opensource-src-5.9.1\qtbase
\mkspecs\win32-g++ -o .obj\release\moc_qwindowsdirect2dnativeinterface.o .moc\re
lease\moc_qwindowsdirect2dnativeinterface.cpp
        g++ -Wl,-s -shared -Wl,-subsystem,windows -Wl,--out-implib,E:\tmpbuild\q
tbase\plugins\platforms\libqdirect2d.a -o ..\..\..\..\plugins\platforms\qdirect2
d.dll object_script.qdirect2d.Release  -ldwmapi -ld2d1 -ld3d11 -ldwrite -lVersio
n -lwinspool -limm32 -lwinmm -loleaut32 -lshlwapi -lshell32 -LE:\tmpbuild\qtbase
\lib E:\tmpbuild\qtbase\lib\libQt5EventDispatcherSupport.a E:\tmpbuild\qtbase\li
b\libQt5AccessibilitySupport.a E:\tmpbuild\qtbase\lib\libQt5FontDatabaseSupport.
a -lole32 -ladvapi32 -luuid E:\tmpbuild\qtbase\lib\libqtfreetype.a E:\tmpbuild\q
tbase\lib\libqtlibpng.a -lz E:\tmpbuild\qtbase\lib\libQt5ThemeSupport.a -lglu32
-lopengl32 -lgdi32 -luser32 E:\tmpbuild\qtbase\lib\libQt5Gui.a E:\tmpbuild\qtbas
e\lib\libQt5Core.a .obj\release\qdirect2d_resource_res.o
        windres -i qjpeg_resource.rc -o .obj\release\qjpeg_resource_res.o --incl
ude-dir=. -DUNICODE -DQT_NO_NARROWING_CONVERSIONS_IN_CONNECT -DQT_NO_EXCEPTIONS
-DQT_NO_DEBUG -DQT_PLUGIN -DQT_GUI_LIB -DQT_CORE_LIB
        E:\tmpbuild\qtbase\bin\moc.exe -DUNICODE -DQT_NO_NARROWING_CONVERSIONS_I
N_CONNECT -DQT_NO_EXCEPTIONS -DQT_NO_DEBUG -DQT_PLUGIN -DQT_GUI_LIB -DQT_CORE_LI
B --include .moc/release/moc_predefs.h -IE:/share/qt-everywhere-opensource-src-5
.9.1/qtbase/mkspecs/win32-g++ -IE:/share/qt-everywhere-opensource-src-5.9.1/qtba
se/src/plugins/imageformats/jpeg -IE:/share/qt-everywhere-opensource-src-5.9.1/q
tbase/src/3rdparty/libjpeg -IE:/share/qt-everywhere-opensource-src-5.9.1/qtbase/
include/QtGui/5.9.1 -IE:/share/qt-everywhere-opensource-src-5.9.1/qtbase/include
/QtGui/5.9.1/QtGui -IE:/tmpbuild/qtbase/include/QtGui/5.9.1 -IE:/tmpbuild/qtbase
/include/QtGui/5.9.1/QtGui -IE:/share/qt-everywhere-opensource-src-5.9.1/qtbase/
include -IE:/share/qt-everywhere-opensource-src-5.9.1/qtbase/include/QtGui -IE:/
tmpbuild/qtbase/include -IE:/tmpbuild/qtbase/include/QtGui -IE:/share/qt-everywh
ere-opensource-src-5.9.1/qtbase/include/QtCore/5.9.1 -IE:/share/qt-everywhere-op
ensource-src-5.9.1/qtbase/include/QtCore/5.9.1/QtCore -IE:/tmpbuild/qtbase/inclu
de/QtCore/5.9.1 -IE:/tmpbuild/qtbase/include/QtCore/5.9.1/QtCore -IE:/share/qt-e
verywhere-opensource-src-5.9.1/qtbase/include/QtCore -IE:/tmpbuild/qtbase/includ
e/QtCore -I. -IE:/msys64/mingw64/include/c++/7.1.0 -IE:/msys64/mingw64/include/c
++/7.1.0/x86_64-w64-mingw32 -IE:/msys64/mingw64/include/c++/7.1.0/backward -IE:/
msys64/mingw64/lib/gcc/x86_64-w64-mingw32/7.1.0/include -IE:/msys64/mingw64/incl
ude -IE:/msys64/mingw64/lib/gcc/x86_64-w64-mingw32/7.1.0/include-fixed -IE:/msys
64/mingw64/x86_64-w64-mingw32/include E:\share\qt-everywhere-opensource-src-5.9.
1\qtbase\src\plugins\imageformats\jpeg\main.h -o .moc\release\moc_main.cpp
        g++ -c -fno-keep-inline-dllexport -pipe -O2 -std=c++11 -fno-exceptions -
Wextra -Wall -W -Wvla -Wdate-time -Wshift-overflow=2 -Wduplicated-cond -DUNICODE
 -DQT_NO_NARROWING_CONVERSIONS_IN_CONNECT -DQT_NO_EXCEPTIONS -DQT_NO_DEBUG -DQT_
PLUGIN -DQT_GUI_LIB -DQT_CORE_LIB -IE:\share\qt-everywhere-opensource-src-5.9.1\
qtbase\src\plugins\imageformats\jpeg -I. -IE:\share\qt-everywhere-opensource-src
-5.9.1\qtbase\src\3rdparty\libjpeg -IE:\share\qt-everywhere-opensource-src-5.9.1
\qtbase\include\QtGui\5.9.1 -IE:\share\qt-everywhere-opensource-src-5.9.1\qtbase
\include\QtGui\5.9.1\QtGui -I..\..\..\..\include\QtGui\5.9.1 -I..\..\..\..\inclu
de\QtGui\5.9.1\QtGui -IE:\share\qt-everywhere-opensource-src-5.9.1\qtbase\includ
e -IE:\share\qt-everywhere-opensource-src-5.9.1\qtbase\include\QtGui -I..\..\..\
..\include -I..\..\..\..\include\QtGui -IE:\share\qt-everywhere-opensource-src-5
.9.1\qtbase\include\QtCore\5.9.1 -IE:\share\qt-everywhere-opensource-src-5.9.1\q
tbase\include\QtCore\5.9.1\QtCore -I..\..\..\..\include\QtCore\5.9.1 -I..\..\..\
..\include\QtCore\5.9.1\QtCore -IE:\share\qt-everywhere-opensource-src-5.9.1\qtb
ase\include\QtCore -I..\..\..\..\include\QtCore -I.moc\release -IE:\share\qt-eve
rywhere-opensource-src-5.9.1\qtbase\mkspecs\win32-g++ -o .obj\release\moc_main.o
 .moc\release\moc_main.cpp
        g++ -Wl,-s -shared -Wl,-subsystem,windows -Wl,--out-implib,E:\tmpbuild\q
tbase\plugins\imageformats\libqjpeg.a -o ..\..\..\..\plugins\imageformats\qjpeg.
dll object_script.qjpeg.Release  -lglu32 -lopengl32 -lgdi32 -luser32 -LE:\tmpbui
ld\qtbase\lib E:\tmpbuild\qtbase\lib\libQt5Gui.a E:\tmpbuild\qtbase\lib\libQt5Co
re.a .obj\release\qjpeg_resource_res.o
jom: E:\tmpbuild\qtbase\Makefile [sub-qmake-qmake-aux-pro-make_first] Error 2
jom: E:\tmpbuild\Makefile [module-qtbase-make_first] Error 2

在这一点上,我想重申,在 Qt 5.8 之前,我已经使用相同的工具链在多个版本上获得了成功的构建。

我的主要开发平台是 windows,我使用 MSYS2 作为构建环境和主要工具链,使用 GCC 5.3.0。我也一直在使用 MSYS2 为 psql 和 mariadbclient 提供的开发库来节省自己构建它们的需要。我还针对 android 和 linux,所以这个问题适用于这 3 个平台。我不针对 macos 或 ios,因此虽然作为 OP 对我没有直接的好处,但这些平台上的信息可能仍然对某些人有用。

那么,有没有人敢于挑战像我这样指导新闻通过获得一个真正的、完全静态的 Qt 构建的困难?

我目前正在努力使用最新版本,目前是 5.9.1,但是这个问题也应该与未来的版本相关,这可能会引入他们自己的怪癖。

【问题讨论】:

  • 不是答案,但我强烈建议将其发布在interest@ML 上,由开发Qt 构建系统的人阅读(他们通常会回复)。另外,您说no meaningful output to signify why =>无论如何请附上所有输出。并且因错误而失败的编译日志不包括失败的命令(因为您正在运行并行 make 很可能它在输出中混杂在一起,运行非并行 make 并获取构建错误)。
  • @peppe 我有点不同意邮件列表,但如果您是参与者,请随时将其与实际问题的链接一起发布。我假设正在研究 Qt 构建系统规模的某个人将拥有一个 SO 帐户,或者至少会对拥有一个感兴趣。我在这里发布的输出是我可以从单线程 make 中得到的,我并没有在其中看到任何有用的信息。而-silent 是不行的,我看不出有一种方法可以将输出提炼成有意义的东西。
  • 由于我的评论空间用完了,我的兴趣是应用程序开发,而不是框架构建受虐狂。因此,我有点不愿意将大量精力投入到原本不应该成为问题的事情上。真的很麻烦,经过 3 年的成功,已经快整整一年了,我还没有能够产生一个成功的静态 Qt 构建。这引出了一个问题,构建系统是否真的得到了改进,或者它是故意定制成对静态构建不友好的东西,从 Qt“法律常见问题解答”及其对该主题的模糊威胁来看
  • 进一步阐述“法律常见问题解答” - 它充满了模糊和模棱两可的威胁,在 LGPL 下静态链接将如何存在问题,几乎没有做出事实上的错误陈述,而实际上 LGPL 所要求的一切是针对一组不同的库重新链接应用程序的能力。这意味着目标文件就足够了。当然,为了促进更多的商业许可销售,他们不鼓励使用 LGPL 并且方便也是可以理解的。因此,在这种情况下,我对允许“digia”员工乐于助人的程度持保留态度……
  • 我认为与许可无关。只是配置/构建系统的5.8重写导致了大量的回归。

标签: c++ qt build static qt5


【解决方案1】:

一个月后,我取得了一些进展,虽然不是 OP 标题,但尽管如此,我现在能够使用我的自定义 SQL 库和工作 SQL 在静态或动态配置中始终如一地构建 Qt。

罪魁祸首实际上是jom,根据配置,它在不同的部分始终失败。我尝试了几个版本,但都失败了。我尝试了许多不同的、逐渐更保守的配置选项,我什至尝试了非常缓慢的单线程构建。都失败了。

但是,使用mingw32-make 的成功率是 100%,我在使用 jom 多年后偶然发现这是最后的尝试,因为据说它更快。但是,make 也支持使用相同的-j coreCount 参数进行并行构建,因此在没有jom 的情况下仍然可以选择快速Qt 构建。

每当我取得更多进展时,我都会回来更新此内容……传奇仍在继续。

【讨论】:

  • 还有进展吗?
  • 不是真的,我的意思是我知道问题出在哪里以及如何解决它,但是解决起来很乏味,以至于不切实际。您基本上必须对构建配置、脚本进行完全硬编码,并显式链接每个依赖项,以及它们的依赖项和它们的依赖项……这几乎不值得付出努力。还不如添加一些额外的 lib 文件。
猜你喜欢
  • 1970-01-01
  • 2013-02-26
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-28
相关资源
最近更新 更多