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?
CONFIG += static
wü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.Antworten:
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.
quelle
Mit Qt 5.5 sind die Dinge ganz einfach. Es gibt folgende orthogonale Einstellungen, an die Sie
configure
beim Erstellen von Qt übergeben:Möchten Sie eine statische Qt-Bibliothek?
-static
Option sollte an übergeben werdenconfigure
Möchten Sie, dass der Build von Qt und Ihrer Anwendung eine statische C ++ - Laufzeit verwendet?
-static-runtime
Option sollte an übergeben werdenconfigure
Möchten Sie XP-Targeting?
-target xp
Option sollte an übergeben werdenconfigure
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 .
quelle
configure
== KONFIG?configure
Skript, das Sie ausführen, bevor Sie Qt selbst erstellen.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 ):
quelle
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.quelle
qmake
da 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)
.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.
Kevin Higgins
quelle
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.
quelle
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 += static
qmake ü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=lib
und verwendet.CONFIG += dll
)quelle