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


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

J'ai simplement sauté dans C ++ et c'est la seule partie que je n'obtiens pas (en tant que programmeur Java). Je suis juste en train de regarder comment je peux utiliser un Qt Bibliothèque et tesseract-ocr, pourtant le processus n'a pas de sens pour moi et il est si difficile de google.

Comment puis-je indiquer au compilateur les fonctions que j'utilise? Devrait-il y avoir un fichier d’inclusion du fournisseur tiers?


63
2018-01-30 15:00


origine


Réponses:


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

La DLL doit avoir un fichier .lib à lier et un ou plusieurs fichiers d'en-tête à inclure dans vos sources. Les fichiers d'en-tête définiront les classes et les prototypes de fonctions que vous pouvez utiliser depuis 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.


62
2018-01-30 15:26



Pour incorporer des DLL tierces dans mon projet VS 2008 C ++, j'ai fait ce qui 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 compilation pour lier le code LIB à mon fichier EXE, copier les DLL et 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 ayez un fichier LIB de talon pour chaque fichier (A.LIB et B.LIB) et fichiers d'en-tête (A.H et B.H).

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

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

  1. Rendez votre EXE dépendant des fichiers LIB

    • Accédez à Propriétés de configuration -> Linker -> Input -> Additional Dependencies, et répertoriez vos fichiers .LIB un par un, séparés par les 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" à tous ceux que vous avez déjà. Les entrées sont séparées par des points-virgules. Par exemple, si vous aviez déjà $(SolutionDir)fodder là, vous le changez pour $(SolutionDir)fodder;$(SolutionDir)lib ajouter "lib".
  2. Forcer les DLL à être copiés dans le répertoire de sortie

    • Accédez à Propriétés de configuration -> Créer des événements -> Événement post-construction
    • Insérez les éléments suivants dans la ligne de commande (pour les significations 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

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

    • Accédez à Propriétés de configuration -> Général -> Extensions à supprimer lors du nettoyage, puis cliquez sur "..."; ajouter *.dllà la fin de la liste et cliquez sur OK.

58
2017-12-05 21:11



Il existe deux manières d’utiliser un fichier DLL sous Windows:

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

  2. Chargement de la DLL manuellement. C'est généralement ce que vous voulez faire si vous développez un système de plug-in où de nombreux fichiers DLL implémentent une interface commune. Consultez la documentation de LoadLibrary et GetProcAddress pour plus d'informations à ce sujet.

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


24
2018-01-30 15:08



Pour utiliser Qt avec une liaison dynamique, vous devez spécifier le lib fichiers (généralement qtmaind.lib, QtCored4.lib et QtGuid4.lib pour la config "Debug") dans
Properties » Linker » Input » Additional Dependencies.

Vous devez aussi spécifier le chemin où les libs sont, à savoir dans
Properties » Linker » General » Additional Library Directories.

Et vous devez faire le correspondant .dlls sont accessibles à 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
2018-01-30 15:22



Vous devez uniquement utiliser LoadLibrary si vous souhaitez retarder la liaison et résoudre uniquement les fonctions importées au moment de l'exécution. La manière la plus simple d'utiliser une DLL tierce consiste à créer un lien avec un .lib.


En réponse à votre modification:

Oui, l'API tierce doit être composée d'une DLL et / ou d'une lib 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 que vous utilisez - pour LoadLibrary, vous devez définir des pointeurs de fonction, vous pouvez donc écrire votre propre fichier d'en-tête à la place. Fondamentalement, vous devez uniquement utiliser LoadLibrary si vous souhaitez une liaison tardive. Une raison valable à cela serait si vous n'êtes pas sûr si la DLL sera disponible sur le PC cible.


3
2018-01-30 15:09



Si vous êtes supposé pouvoir l'utiliser, alors 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 de l'é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 qui lie votre fichier exécutable à la DLL.


2
2018-01-30 15:08