web-dev-qa-db-fra.com

Liaison statique et déploiement Qt

J'essaie de déployer (publication au public) une application qt simple que j'ai créée récemment, mais que je suis restée bloquée à la liaison statique de bibliothèques qt.

J'ai suivi le guide sur qt docs pour reconstruire qt et mon application de manière statique. Mais la version de compilation nécessite encore qtgui/qtcore dll sans aucune raison apparente, je me demande si quelqu'un a déjà vu ce genre de problèmes? Ou mieux encore, l'a-t-il résolu avec succès?

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

60

J'ai écrit un guide sur les liens statiques

et Comment construire Qt static avec plusieurs compilateurs et le garder petit

(Parce que cela peut devenir assez volumineux, en particulier pour les programmes simples) ..____. Vous pouvez également consulter le programme d’installation de BitRock, qui est gratuit pour les projets open source.

En bref, cela s'avère un peu plus complexe si vous utilisez quelque chose que Qt considère comme un plugin, tel que le support de la plupart des types d'images (JPEG, GIF) ou de bases de données . Par exemple, si vous souhaitez inclure support pour les images Oracle SGBD et GIF de vos icônes, vous ajoutez les éléments suivants à votre fichier .PRO:

QTPLUGIN += qsqloci qgif
CONFIG += static

Vous devrez ensuite:

#include <QtPlugin>

dans votre projet et importez tous les plugins utilisés. Vous devez modifier ces paramètres dans l'ordre inverse pour qu'il soit compilé avec une liaison dynamique à nouveau (comme lors du débogage ou de l'ajout de fonctionnalités), bien que cela puisse être facilement automatisé. Il existe également des considérations lors de la construction des bibliothèques Qt à utiliser avec des liens statiques, bien que les instructions Qt vous aident au moins à démarrer.

42
Charles Burns

Avec Qt 5.5, les choses sont assez faciles. Il y a les paramètres orthogonaux suivants que vous passez à configure lors de la construction de Qt:

  1. Voulez-vous une bibliothèque Qt statique?

    L'option -static doit être passée à configure

  2. Voulez-vous que la construction de Qt et de votre application utilise un runtime C++ statique?

    L'option -static-runtime doit être passée à configure

  3. Voulez-vous le ciblage XP?

    L'option -target xp doit être passée à configure

    De plus, suivez les instructions de cet article de blog .

    Qt Creator ne supportait pas le ciblage XP au moins jusqu'à la version v.3.5.0, car il ne configurait pas correctement l'environnement des outils de construction. Vous devez modifier l’environnement de construction manuellement par le blog .

16
Kuba Ober

Sachez également que votre version statique sera toujours reliée dynamiquement aux exécutions de Visual Studio!

Voir cette faq ( lien d’archive Internet, au cas où le lien disparaîtrait ):

Pourquoi un Qt construit de manière statique utilise-t-il les bibliothèques d'exécution dynamiques Visual Studio? Dois-je les déployer avec mon application?

Qt est construit à l'aide du commutateur -MD (d), qui établit une liaison avec les bibliothèques d'exécution dynamiques C/C++. Cela est nécessaire car nous avons eu des problèmes de mémoire lorsque nous avons utilisé autre chose que le drapeau -MD (d). En général, il est recommandé de l'utiliser. Vous ne devez pas modifier vous-même cet indicateur pour votre application, car il entre en conflit avec la construction de la bibliothèque Qt si vous modifiez cet indicateur en -MT. Vous ne devriez pas le changer pour Qt non plus, car il est susceptible de causer des problèmes.

Qt est toujours construit de manière statique avec l'option -static, ce qui signifie que vous n'avez pas besoin de distribuer les dll Qt lors du déploiement de votre application. Vous devrez cependant distribuer les runtimes C (s'ils n'existent pas déjà sur la machine cible), consultez notre documentation de déploiement http://doc.qt.io/qt-5/windows-deployment.html#application -dépendances

6
Legolas

msys2 a un paquet pré-construit statique Qt5

… Qui, en utilisant CMake, lorsque la propriété cible CMAKE_AUTOSTATICPLUGINS est définie, relie également tous les plugins disponibles. (ceci, pour le moment, n'est activé que par des correctifs en aval, non officiels, mais atteint l'objectif)

Si vous utilisez qmake, cela vous épargne au moins l'effort de le construire vous-même. 

2
Darklighter

Je viens de compiler une application statiquement (Debug) Avec QT Plugins (5.9), Avec VS (2015) (Win).

a) Ajoutez à votre code.

#include <QtPlugin>
Q_IMPORT_PLUGIN (QWindowsIntegrationPlugin);

b) Ajoutez ce qui suit aux chemins des liens

\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) Ajoutez la liste des bibliothèques statiques QT et des bibliothèques VS internes à votre liste de liens.

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

Je vous recommande d'utiliser linuxdeployqt cet outil. Cela peut aider à résoudre la plupart des problèmes de dépendance. Et je l’utilise pour emballer mon application qt avec succès.

0
KingKong