wake-up-neo.com

Statische Verknüpfung und Bereitstellung von Qt

Ich versuche, eine einfache qt-Anwendung bereitzustellen, die ich vor kurzem erstellt habe, aber bei der statischen Verknüpfung von qt libs stecken geblieben ist.

Ich folgte der Anleitung zu qt docs, um qt und meine App statisch neu zu erstellen. Aber der Release-Build erfordert immer noch qtgui/qtcore-dll ohne ersichtliche Gründe. Ich frage mich, ob jemand diese Art von Problemen schon einmal gesehen hat. Oder noch besser, hat es erfolgreich gelöst?

http://doc.qtsoftware.com/4.5/deployment-windows.html

60

Ich habe eine Anleitung zur statischen Verknüpfung geschrieben

und Wie man Qt statisch mit mehreren Compilern baut und klein hält

(weil es ziemlich groß werden kann, vor allem für einfache Programme) . Vielleicht möchten Sie auch den BitRock-Installer ausprobieren, der für Open Source-Projekte kostenlos ist.

Kurz gesagt, es ist etwas komplexer, wenn Sie etwas verwenden, das Qt als Plug-in betrachtet, z. B. Unterstützung für die meisten Bildtypen (JPEG, GIF) oder Datenbanken. __ Wenn Sie Oracle DBMS- und GIF-Images für Ihre Symbole unterstützen, fügen Sie Ihrer .PRO-Datei Folgendes hinzu:

QTPLUGIN += qsqloci qgif
CONFIG += static

Sie müssen dann:

#include <QtPlugin>

importieren Sie alle in Ihrem Projekt verwendeten Plugins. Sie müssen diese Einstellungen in der vorherigen Reihenfolge ändern, damit das dynamische Linking erneut kompiliert werden kann (z. B. beim Debuggen oder Hinzufügen von Features). Dies kann jedoch leicht automatisiert werden. Es gibt auch Überlegungen beim Erstellen der Qt-Bibliotheken zur Verwendung mit statischen Verknüpfungen, obwohl die Qt-Anweisungen zumindest den Einstieg erleichtern.

42
Charles Burns

Mit Qt 5.5 ist das ganz einfach. Es gibt folgende orthogonale Einstellungen, die Sie beim Erstellen von Qt an configure übergeben:

  1. Möchten Sie eine statische Qt-Bibliothek?

    Die -static-Option sollte an configure übergeben werden.

  2. Soll der Build von Qt und Ihrer Anwendung eine statische C++ - Laufzeit verwenden?

    Die -static-runtime-Option sollte an configure übergeben werden.

  3. Soll das Targeting von XP erfolgen?

    Die -target xp-Option sollte an configure übergeben werden.

    Folgen Sie zusätzlich den Anweisungen aus diesem Blogbeitrag .

    Qt Creator unterstützte XP nicht mindestens bis Version 3.5.0 automatisch, da die Umgebung für die Build-Tools nicht ordnungsgemäß eingerichtet wurde. Sie müssen die Build-Umgebung manuell ändern je nach Blogbeitrag .

16
Kuba Ober

Beachten Sie auch, dass Ihr statischer Build immer noch dynamisch mit den Laufzeiten des Visual Studio verbunden ist!

Siehe diese FAQ ( Internetarchiv-Link, falls der Link wegfällt ):

Warum verwendet ein statisch erstelltes Qt die dynamischen Visual Studio-Laufzeitbibliotheken? Muss ich diese mit meiner Anwendung bereitstellen?

Qt wird mit dem Schalter -MD (d) erstellt, der eine Verknüpfung mit den dynamischen C/C++ - Laufzeitbibliotheken herstellt. Dies ist notwendig, da wir Speicherprobleme hatten, wenn Sie etwas anderes als das -MD (d) -Flag verwenden. Im Allgemeinen wird die Verwendung empfohlen. Sie sollten dieses Flag für Ihre Anwendung nicht selbst ändern, da es mit der Erstellung der Qt-Bibliothek in Konflikt steht, wenn Sie das Flag in -MT ändern. Sie sollten es auch nicht für Qt ändern, da dies wahrscheinlich zu Problemen führt.

Qt wird jedoch weiterhin statisch erstellt, wenn Sie die Option -static verwenden. Dies bedeutet, dass Sie die Qt-DLLs bei der Bereitstellung Ihrer Anwendung nicht verteilen müssen. Sie müssen jedoch die C-Laufzeiten verteilen (falls diese noch nicht auf dem Zielcomputer vorhanden sind). Weitere Informationen finden Sie in unserer Implementierungsdokumentation http://doc.qt.io/qt-5/windows-deployment.html#application -abhängigkeiten

6
Legolas

msys2 hat ein vorinstalliertes statisches Qt5-Paket

… Die bei Verwendung von CMake, wenn die Zieleigenschaft CMAKE_AUTOSTATICPLUGINS gesetzt ist, auch alle verfügbaren Plugins verknüpft. (Dies ist derzeit nur durch Downstream-Patches inoffiziell möglich, erreicht aber das Ziel.)

Wenn Sie qmake verwenden, erspart Ihnen dies zumindest den Aufwand, es selbst zu bauen. 

2
Darklighter

Ich habe gerade eine Anwendung statisch (Debug) Mit QT Plugins (5.9), Mit VS (2015) (Win) erstellt.

a) Fügen Sie Ihrem Code hinzu.

#include <QtPlugin>
Q_IMPORT_PLUGIN (QWindowsIntegrationPlugin);

b) Fügen Sie den Linkpfaden Folgendes hinzu

\5.9.0_x86_static_install\lib
\5.9.0_x86_static_install\bin
\5.9.0_x86_static_install\plugins
\5.9.0_x86_static_install\plugins\platforms
\5.9.0_x86_static_install\plugins\imageformats

c) Fügen Sie die Liste der statischen QT-Bibliotheken und der internen VS-Bibliotheken zu Ihrer Linkliste hinzu.

version.lib
imm32.lib
shlwapi.lib
rpcrt4.lib
Ws2_32.lib
Mpr.lib
Netapi32.lib
Rpcrt4.lib
Iphlpapi.lib
winmm.lib
gdi32.lib
advapi32.lib
msimg32.lib
UxTheme.lib
translatord.lib
preprocessord.lib
d3d9.lib
dxguid.lib
libEGLd.lib
libGLESv2d.lib
iphlpapi.lib
psapi.lib
ws2_32.lib
Dwmapi.lib
Qt5CoreD.lib
Qt5Guid.lib
Qt5Xmld.lib
Qt5Widgetsd.lib
Qt5Networkd.lib
Qt5Winextrasd.lib
Qt5PlatformCompositorSupportd.lib
qicod.lib
qtmaind.lib
qtlibpngd.lib
qtharfbuzzd.lib
qtpcre2d.lib
qwindowsd.lib
Qt5FontDatabaseSupportd.lib
Qt5ThemeSupportd.lib
Qt5EventDispatcherSupportd.lib
Qt5AccessibilitySupportd.lib
qtfreetyped.lib

Kevin Higgins

2
kevin higgins

Ich empfehle Ihnen, linuxdeployqt dieses Tool zu verwenden. Es kann helfen, die meisten Abhängigkeitsprobleme zu lösen. Und ich verwende es, um meine qt-Anwendung erfolgreich zu packen.

0
KingKong