Qt statische Verknüpfung und Bereitstellung


71

Ich versuche, eine einfache qt-Anwendung, die ich kürzlich erstellt habe, bereitzustellen (für die Öffentlichkeit freizugeben), bin aber bei der statischen Verknüpfung von qt-Bibliotheken hängen geblieben.

Ich habe die Anleitung zu qt docs befolgt, 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


1
Haben Sie statische Kopien von QtCore4.a, QtGui4.a? Dann CONFIG += staticwürde das Hinzufügen dies lösen. Wenn Sie keine statische Kopie von Qt haben, greifen Sie zur Quelle und erstellen Sie sie. Es dauert mehrere Stunden, um statische Bibliotheken zu erhalten.
Md. Minhazul Haque

Antworten:


46

Ich habe eine Anleitung zur statischen Verknüpfung geschrieben

und wie man Qt static mit mehreren Compilern erstellt und klein hält

(weil es ziemlich groß werden kann, besonders für einfache Programme). Vielleicht möchten Sie auch das BitRock-Installationsprogramm ausprobieren, das für Open Source-Projekte kostenlos ist.

Kurz gesagt, es stellt sich als etwas komplexer heraus, wenn Sie etwas verwenden, das Qt als Plugin betrachtet, z. B. Unterstützung für die meisten Bildtypen (JPEG, GIF) oder Datenbanken. Wenn Sie beispielsweise Oracle DBMS- und GIF-Images für Ihre Symbole unterstützen möchten, fügen Sie Ihrer PRO-Datei Folgendes hinzu:

QTPLUGIN += qsqloci qgif
CONFIG += static

Sie müssen dann:

#include <QtPlugin>

in Ihrem Projekt und importieren Sie alle verwendeten Plugins. Sie müssen diese Einstellungen nachträglich ändern, damit sie wieder mit dynamischer Verknüpfung kompiliert werden können (z. B. beim Debuggen oder Hinzufügen von Funktionen). Dies kann jedoch problemlos 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.


15
Beachten Sie Lizenzprobleme, wenn Sie statisch verknüpfen.
Lisa

4
Wayback Machine Links unten. Erster Link ist der Artikel über die statische Verknüpfung von Qt4 mit der Anwendung. Der zweite Link ist der Artikel über das Erstellen von Qt, um kleiner zu sein und statische Verknüpfungen durchführen zu können. web.archive.org/web/20120729010312/http://www.formortals.com/… web.archive.org/web/20120723142656/http://www.formortals.com/…
EMPraptor

3
@JaredGlass Sie werden froh sein zu wissen, dass der Link wieder hergestellt ist.
Charles Burns

@ CharlesBurns, hm, schon wieder kaputt?
FRD

1
@Oshada doc.qt.io/QtForDeviceCreation/qtee-static-linking.html ist die aktuelle offizielle Dokumentation.
Charles Burns

19

Mit Qt 5.5 sind die Dinge ganz einfach. Es gibt folgende orthogonale Einstellungen, an die Sie configurebeim Erstellen von Qt übergeben:

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

    -static Option sollte an übergeben werden configure

  2. Möchten Sie, dass der Build von Qt und Ihrer Anwendung eine statische C ++ - Laufzeit verwendet?

    -static-runtime Option sollte an übergeben werden configure

  3. Möchten Sie XP-Targeting?

    -target xp Option sollte an übergeben werden configure

    Befolgen Sie außerdem die Anweisungen in diesem Blogbeitrag .

    Qt Creator unterstützte XP-Targeting zumindest bis Version 3.5.0 nicht automatisch, da die Umgebung für die Build-Tools nicht ordnungsgemäß eingerichtet wurde. Sie müssen die Build-Umgebung manuell gemäß dem Blog-Beitrag ändern .


configure== KONFIG?
user2962533

2
@ user2962533 Nein, hier geht es um das configureSkript, das Sie ausführen, bevor Sie Qt selbst erstellen.
Kuba hat Monica am

8

Beachten Sie auch, dass Ihr statischer Build weiterhin dynamisch mit den Laufzeiten des Visual Studios verknüpft wird!

Siehe diese FAQ ( Internet-Archiv-Link, falls der Link verschwindet ):

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

Qt wird mit dem Schalter -MD (d) erstellt, der mit den dynamischen C / C ++ - Laufzeitbibliotheken verknüpft ist. Dies ist erforderlich, da bei der Verwendung von etwas anderem als dem -MD (d) -Flag Speicherprobleme aufgetreten sind. Im Allgemeinen wird die Verwendung empfohlen. Sie sollten dieses Flag für Ihre Anwendung nicht selbst ändern, da es im Widerspruch zum Aufbau der Qt-Bibliothek steht, wenn Sie das Flag in -MT ändern. Sie sollten es auch nicht für Qt ändern, da es wahrscheinlich Probleme verursacht.

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


4

msys2 verfügt über ein vorgefertigtes statisches Qt5-Paket

z.B pacman -S mingw-w64-qt5-static

Derzeit müssen Sie Folgendes hinzufügen, um alle Abhängigkeiten von Qt mit CMake statisch zu verknüpfen:
list(PREPEND CMAKE_FIND_LIBRARY_SUFFIXES .a .lib)
Bevor Sie find_package(Qt5


CMAKE_AUTOSTATICPLUGINS wurde durch eine neue Upstream-Implementierung ersetzt und wird nicht mehr benötigt.


Ich möchte dies verwenden, bin mir aber nicht sicher, wie ich CMAKE_AUTOSTATICPLUGINS festlegen soll. Ich benutze qmake dann machen. Kannst du beraten?
Tofutim

Haben Sie dort falsch geschrieben, qmakeda es hier um CMake geht ? Sie können es einfach global festlegen: set(CMAKE_AUTOSTATICPLUGINS ON)oder als zielspezifische Eigenschaft : set_target_properties(${PROJECT_NAME} PROPERTIES AUTOSTATICPLUGINS ON).
Darklighter

3

Ich habe gerade eine statische Anwendung (Debug) mit QT Plugins (5.9) und VS (2015) (Win) kompiliert.

a) Fügen Sie Ihrem Code hinzu.

#include <QtPlugin>
Q_IMPORT_PLUGIN (QWindowsIntegrationPlugin);

b) Fügen Sie den Verbindungspfaden 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 Ihrer Linkliste die Liste der statischen QT-Bibliotheken und internen VS-Bibliotheken 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


toll, das hat mir geholfen, ich habe eine deiner .libs vermisst, die du hier erwähnt hast und verdrahtete Verbindungsfehler bekommen, vielen Dank

Hey Kevin! Danke für das Teilen! Darf ich Sie bitte fragen, welche Konfiguration Sie verwendet haben, um qt mit statischem Link zu erstellen? Ich ging zum Src-Ordner und tat: "configure -platform win32-msvc -static -release -nomake examples -nomake tests -opensource" und ich bemerkte auch, dass in Ihren Antworten die Bibliotheken, mit denen Sie verknüpfen, die Debug-Bibliotheken sind, also ich natürlich auf Release eins geändert und immer noch Verknüpfungsfehler bekommen. Ich denke, ich muss qt erneut erstellen und versuchen, für Debug und Release zu

2

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


0

Diese Antwort gilt für die Verwendung von MSYS2 mit mingw -w64 als Compiler unter Windows und qmake. Die QT-Version ist 5.15.0.


Durch die Installation des Pakets erhalten qt5-static Sie einen QT-Build, der ausführbare Dateien erzeugt, die nicht auf QT-DLLs angewiesen sind. (Beispiel Befehlszeile -pacman -Ss mingw64/mingw-w64-x86_64-qt5-static ).

Hier wird jedoch ein neues Problem eingeführt: Es besteht das nicht -static Flag nicht an gcc. Dies bedeutet, dass die ausführbare Datei zwar nicht von QT-DLLs abhängt, jedoch von libgcc-s, libwinpthread.dll usw.

Normalerweise wird dieses Problem behoben, indem CONFIG += staticqmake übergeben wird-static an gcc übergeben wird. Wie in den anderen Antworten angegeben, wird diese Konfigurationsoption bei einem qt-statischen Build jedoch ignoriert!

Um dies zu lösen, musste ich die gcc-Flags für die statische Verknüpfung in der qmake-Datei manuell angeben, dh:

QMAKE_CXXFLAGS += -static
QMAKE_LFLAGS_WINDOWS += -static

Dies führt zu einer (großen) Binärdatei ohne externe Abhängigkeiten außer Windows-System-DLLs.

(Falls es darauf ankommt: Mein Anwendungsfall war das Erstellen einer COM-In-Process-Server-DLL, die keine externen Abhängigkeiten aufweisen sollte. Ich habe auch TEMPLATE=libund verwendet. CONFIG += dll)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.