web-dev-qa-db-fra.com

Comment utiliser un fichier tiers DLL dans Visual Studio C ++?

Je comprends que je dois utiliser LoadLibrary (). Mais quelles autres étapes dois-je suivre pour utiliser un fichier tiers DLL?

J'ai simplement sauté dans C++ et c'est la seule partie que je ne reçois pas (en tant que programmeur Java). Je cherche simplement à utiliser un Qt Library et tesseract-ocr, mais le processus n’a aucun sens pour moi et il est si difficile à rechercher sur Google.

Comment puis-je informer le compilateur des fonctions que j'utilise? Devrait-il y avoir un fichier d'inclusion provenant du fournisseur tiers?

68
Zombies

Comme tout le monde le dit, LoadLibrary est le moyen le plus difficile de le faire et n’est pratiquement jamais nécessaire.

La DLL aurait dû être accompagnée d'un fichier .lib pour la liaison et d'un ou plusieurs fichiers d'en-tête à #include dans vos sources. Les fichiers d'en-tête définiront les prototypes de classes et de fonctions que vous pouvez utiliser à partir de la DLL, vous en aurez besoin même si vous utilisez LoadLibrary.

Pour créer un lien avec la bibliothèque, vous devrez peut-être ajouter le fichier .lib à la configuration du projet sous Linker/Input/Additional Dependencies.

65
Mark Ransom

Pour incorporer des DLL tierces dans mon projet C++ de VS 2008, j'ai procédé comme suit (vous devriez pouvoir traduire en 2010, 2012, etc.) ...

J'ai mis les fichiers d'en-tête dans ma solution avec mes autres fichiers d'en-tête, apporté des modifications à mon code pour appeler les fonctions des DLL (sinon, pourquoi ferions-nous tout cela?). : ^) Ensuite, j'ai modifié la construction pour lier le code LIB à mon fichier EXE, pour copier les DLL en place et pour les nettoyer lorsque j'ai effectué un nettoyage - j'explique ces modifications ci-dessous.

Supposons que vous ayez deux DLL tierces, A.DLL et B.DLL, et que vous disposiez d'un fichier LIB stub pour chaque fichier (A.LIB et B.LIB) et de fichiers d'en-tête (A.H et B.H).

  • Créez un répertoire "lib" sous votre répertoire de solution, par exemple. en utilisant Windows Explorer.
  • Copiez vos fichiers tiers .LIB et .DLL dans ce répertoire

(Vous devrez apporter la prochaine série de modifications une fois pour chaque cible de génération source que vous utilisez (Debug, Release).)

  1. Rendre votre fichier EXE dépendant des fichiers LIB

    • Allez dans Propriétés de configuration -> lieur -> entrée -> dépendances supplémentaires, et listez vos fichiers .LIB un par un, séparés par espaces: A.LIB B.LIB
    • Allez dans Propriétés de configuration -> Général -> Répertoires de bibliothèque supplémentaires, et ajoutez votre répertoire "lib" à ceux que vous avez déjà là. Les entrées sont séparées par points-virgules. Par exemple, si vous avez déjà eu $(SolutionDir)fodder, vous le changez en $(SolutionDir)fodder;$(SolutionDir)lib pour ajouter "lib".
  2. Forcer les DLL à être copiées dans le répertoire de sortie

    • Allez dans Propriétés de configuration -> Événements de construction -> Événement post-construction
    • Mettez ce qui suit dans la ligne de commande (pour la signification du commutateur, voir "XCOPY /?" Dans une fenêtre DOS):

    XCOPY "$(SolutionDir)"\lib\*.DLL "$(TargetDir)" /D /K /Y

    • Vous pouvez mettre quelque chose comme ceci pour Description:

    Copy DLLs to Target Directory

    • Exclus de la construction devrait être No. Cliquez sur OK.
  3. Dites à VS de nettoyer les DLL lorsqu'il nettoie un dossier de sortie:

    • Allez dans Propriétés de configuration -> Général -> Extensions à supprimer lors du nettoyage, puis cliquez sur "..."; ajoutez *.dll à la fin de la liste et cliquez sur OK.
62
rich p

Voici deux manières d’utiliser un fichier DLL dans Windows:

  1. Il existe une bibliothèque de stub (.lib) avec les fichiers d’en-tête associés. Lorsque vous liez votre fichier exécutable au fichier lib-file, il charge automatiquement le fichier DLL lors du démarrage du programme.

  2. Chargement manuel du fichier DLL. C'est généralement ce que vous souhaitez faire si vous développez un système de plug-in comportant de nombreux fichiers DLL implémentant une interface commune. Cochez la documentation de LoadLibrary et GetProcAddress pour plus d'informations à ce sujet.

Pour Qt, je pense qu'il existe des en-têtes et une bibliothèque statique disponibles que vous pouvez inclure et lier dans votre projet.

24
Laserallan

Pour utiliser Qt avec des liens dynamiques, vous devez spécifier les fichiers lib (généralement qtmaind.lib, QtCored4.lib et QtGuid4.lib pour la configration "Debug") dans
Properties » Linker » Input » Additional Dependencies.

Vous devez également spécifiez le chemin où se trouvent les bibliothèques, à savoir dans
Properties » Linker » General » Additional Library Directories.

Et vous devez faire le .dlls sont accessibles au moment de l’exécution, soit en les stockant dans le même dossier que votre .exe ou dans un dossier qui est sur votre chemin.

6
drby

Vous ne devez utiliser LoadLibrary que si vous souhaitez lier tardivement et résoudre uniquement les fonctions importées au moment de l'exécution. Le moyen le plus simple d’utiliser une tierce partie est de créer un lien avec un fichier .lib.


En réponse à votre modification:

Oui, l'API tierce doit être composée d'une dll et/ou d'une bibliothèque contenant les fichiers d'implémentation et d'en-tête qui déclarent les types requis. Vous devez connaître les définitions de type, quelle que soit la méthode utilisée - pour LoadLibrary, vous devez définir des pointeurs de fonction, de sorte que vous puissiez également écrire votre propre fichier d'en-tête à la place. Fondamentalement, vous ne devez utiliser LoadLibrary que si vous souhaitez une liaison tardive. Une raison valable pour cela serait si vous n'êtes pas sûr que la dll sera disponible sur le PC cible.

3
Stu Mackellar

Si vous êtes supposé pouvoir l'utiliser, la bibliothèque tierce devrait avoir un fichier * .lib ainsi qu'un fichier * .dll. Vous devez simplement ajouter le fichier * .lib à la liste des fichiers d'entrée dans les options "Éditeur de liens" de votre projet.

Ce fichier * .lib n'est pas nécessairement une bibliothèque 'statique' (qui contient du code): à la place, un fichier * .lib peut être simplement un fichier reliant votre exécutable à la DLL.

2
ChrisW