web-dev-qa-db-fra.com

Ajouter une bibliothèque externe au projet Qt Creator

Comment ajouter une bibliothèque externe à un projet construit par Qt Creator RC1 (version 0.9.2)? Par exemple, la fonction win32 EnumProcesses() requiert l'ajout de Psapi.lib dans le projet à générer.

102
Donotalo

La bonne façon de faire est la suivante:

LIBS += -L/path/to -lpsapi

De cette façon, cela fonctionnera sur toutes les plateformes supportées par Qt. L'idée est que vous devez séparer le répertoire du nom de la bibliothèque (sans l'extension et sans préfixe 'lib'). Bien sûr, si vous incluez une bibliothèque spécifique à Windows, cela n'a pas d'importance.

Si vous souhaitez stocker vos fichiers lib dans le répertoire du projet, vous pouvez les référencer avec la variable $$_PRO_FILE_PWD_, par exemple:

LIBS += -L"$$_PRO_FILE_PWD_/3rdparty/libs/" -lpsapi
207
Ben

Utilisez-vous des projets qmake? Si c'est le cas, vous pouvez ajouter une bibliothèque externe à l'aide de la variable LIBS . Par exemple:

win32:LIBS += path/to/Psapi.lib
22
dirkgently

LIBS + = C:\Program Files\OpenCV\lib

ne fonctionnera pas parce que vous utilisez des espaces blancs dans Program Files. Dans ce cas, vous devez ajouter des guillemets afin que le résultat se présente comme suit: LIBS + = "C:\Program Files\OpenCV\lib" . Je vous recommande de placer les bibliothèques dans des emplacements non blancs; -)

11
martin

L'erreur que vous voulez dire est due à l'absence du chemin d'inclusion supplémentaire . Essayez de l'ajouter comme suit:.

6
fernando

Et pour ajouter plusieurs fichiers de bibliothèque, vous pouvez écrire comme suit:

INCLUDEPATH * = E:/DebugLibrary/VTK E:/DebugLibrary/VTK/Common E:/DebugLibrary/VTK/Filtrage E:/DebugLibrary/VTK/GenericFiltering E:/Bibliothèque de débogage/VTK/Graphics E:/Bibliothèque de débogage/VTK/GUISupport/Qt E:/DebugLibrary/VTK/Hybride E:/DebugLibrary/VTK/Imaging E:/DebugLibrary/VTK/IO E:/DebugLibrary/VTK/Parallel E:/DebugLibrary/VTK/Rendu E:/DebugLibrary/VTK/Utilities E:/DebugLibrary/VTK/VolumeRendering E:/DebugLibrary/VTK/Widgets E:/DebugLibrary/VTK/Wrapping 

LIBS * = -LE:/DebugLibrary/VTKBin/bin/release -lvtkCommon -lvtksys -lQVTK -lvtkWidgets -lvtkRendering -lvtkGraphics -lvtkImaging -lvtkIO -lvtkFiltering -lvtkDICOMParser -lvtkpng -lvtktiff -lvtkzlib -lvtkjpeg -lvtkexpat -lvtkNetCDF -lvtkexoIIc -lvtkftgl -lvtkfreetype -lvtkHybrid -lvtkVolumeRendering -lQVTKWidgetPlugin -lvtkGenericFiltering

4
QT-ITK-VTK-Help

Si vous souhaitez déployer votre application sur des machines de clients, plutôt que d'utiliser votre application vous-même, nous constatons que la méthode LIBS+= -Lxxx -lyyy peut entraîner une confusion, voire des problèmes.

Nous développons des applications pour Linux, Mac et Windows en utilisant Qt. Nous livrons des applications complètes et autonomes. Toutes les bibliothèques non-système doivent donc être incluses dans le package de déploiement. Nous voulons que nos clients puissent exécuter l'application à partir de la même clé USB pour tous les systèmes d'exploitation. Pour des raisons de compatibilité de plate-forme, la clé USB doit alors être au format FAT32, qui ne prend pas en charge les liens symboliques (Linux).

Nous avons trouvé le LIBS+= -Lxxx -lyyy idiome trop d'une boîte noire:

  1. Nous ne savons pas exactement quel est le chemin du fichier de la bibliothèque (statique ou dynamique) trouvée par l'éditeur de liens. C'est gênant. Notre éditeur de liens Mac a régulièrement trouvé des bibliothèques différentes de celles que nous pensions devoir utiliser. Cela s'est produit à plusieurs reprises avec les bibliothèques OpenSSL où l'éditeur de liens Mac avait trouvé et utilisé sa propre version - plus ancienne et incompatible - OpenSSL plutôt que la version demandée.

  2. Nous ne pouvons pas nous permettre que l'éditeur de liens utilise des liens symboliques vers des bibliothèques car cela endommagerait le package de déploiement.

  3. Nous voulons voir à partir du nom de la bibliothèque si nous lions une bibliothèque statique ou dynamique.

Donc, dans notre cas particulier, nous utilisons uniquement les chemins de fichiers absolus et vérifions s’ils existent. Nous supprimons tous les liens symboliques.

Premièrement, nous découvrons quel système d’exploitation nous utilisons et nous le mettons dans la variable CONFIG. Et, par exemple pour Linux 64 bits, alors:

linux64 {
    LIBSSL= $$OPENSSLPATH/linux64/lib/libssl.a
    !exists($$LIBSSL): error ("Not existing $$LIBSSL")
    LIBS+= $$LIBSSL
    LIBCRYPTO= $$OPENSSLPATH/linux64/lib/libcrypto.a
    !exists($$LIBCRYPTO): error ("Not existing $$LIBCRYPTO")
    LIBS+= $$LIBCRYPTO
}

Toutes les dépendances peuvent être copiées dans le package de déploiement car nous connaissons leurs chemins de fichiers.

3
adlag

Par souci d'exhaustivité, je voudrais ajouter que vous pouvez également ajouter simplement le chemin LIBRARY PATH, qui recherchera une bibliothèque dépendante (qui peut ne pas être directement référencée dans votre code mais une bibliothèque que vous utilisez peut en avoir besoin).

À titre de comparaison, cela correspond à ce que fait l’environnement LIBPATH, mais c’est un peu obscur dans Qt Creator et il n’est pas bien documenté.

Voici comment je suis arrivé:

LIBS += -L"$$_PRO_FILE_PWD_/Path_to_Psapi_lib/"

Essentiellement, si vous ne fournissez pas le nom réel de la bibliothèque, le chemin sera ajouté à l'emplacement où les recherches seront effectuées dans les bibliothèques dépendantes. La différence de syntaxe est faible, mais il est très utile de ne fournir que le PATH où rechercher les bibliothèques dépendantes. Il est parfois difficile de fournir chaque bibliothèque de chemins individuels où vous savez qu’elles sont toutes dans un certain dossier et que Qt Creator les récupérera.

1
zar

dans .pro: LIBS += Ole32.lib OleAut32.lib Psapi.lib advapi32.lib

dans .h/.cpp: #pragma comment(lib,"user32.lib")

#pragma comment(lib,"psapi.lib")
0
Dnyaneshwar