web-dev-qa-db-fra.com

Comment faire en sorte que Qt et Qtcreator relient les bibliothèques statiquement au lieu de dynamiques?

Je sais que cela pourrait être une question similaire à beaucoup d'autres, mais après avoir cherché plusieurs fois et n'ayant pas réussi à trouver une solution définitive et efficace, je dois poser cette question.

J'utilise Qt 5.2.0 pour Windows 32 bits (VS 2010, 570 Mo), et j'ai déjà fait ma programmation, et tout est fait. Mais maintenant, je veux le distribuer en tant que fichier .exe à mes collègues, mais pour le faire sans complication et pour éviter d'avoir à distribuer des fichiers dll, je dois construire le programme en utilisant une liaison statique.

Pourriez-vous s'il vous plaît décrire comment je peux faire Qt 5.2.0 pour Windows 32 bits (VS 2010, 570 Mo) construire tout le programme en utilisant une liaison statique?

Merci.

18
the_naive

Vous pouvez utiliser la variable CONFIG pour cela avec qmake:

CONFIG += static

ou

CONFIG += staticlib

Cependant, vous devrez vous assurer que vous disposez de toutes les bibliothèques que vous souhaitez regrouper, disponibles sous forme statique.

Cela inclut également le cadre Qt lui-même si vous respectez la licence pour le faire. L'installation officielle ne configure que des bibliothèques dynamiques (fichiers .dll), vous devrez donc créer Qt par vous-même pour y parvenir.

Vous pouvez utiliser les commandes suivantes pour créer Qt statiquement pour votre propre usage:

configure -developer-build -opensource -nomake examples -nomake tests -static
qmake -r
nmake

Notez qu'en général, lors de la création de logiciels Qt tiers comme le vôtre, il vaut mieux invoquer qmake avec le paramètre suivant pour passer correctement votre environnement:

qmake -r -spec win32-msvc2010 

Veuillez également noter que, comme Frank et ManuelH l'ont écrit dans le commentaire, le lien statique n'est pas autorisé si votre application n'est pas sous licence gratuite soit une LGPL ou au moins compatible avec LGPL, ni n'utilisez une licence commerciale pour Qt. Il vaut mieux s'en assurer avant de reprendre votre approche.

Une fois cela fait, vous pouvez utiliser la variable LIBS de la manière habituelle, comme dans: lui passer le chemin de votre bibliothèque statique avec le nom de la bibliothèque, donc quelque chose comme ceci:

LIBS += -L/path/to/the/static/library -lstaticlibraryname

Notez que le nom de bibliothèque statique transmis au paramètre -l Ne doit pas contenir l'extension de bibliothèque statique, par exemple .lib Sous Windows.

En guise de solution de rechange, vous pouvez toujours lier d'autres bibliothèques statiquement, et placer les fichiers dll Qt à côté de l'exécutable, et vous déployez le dossier en tant que "package". C'est probablement la façon la plus simple pour vous d'aller.

22
lpapp