54 votes

Lier une dll dans Visual Studio

Comment puis-je ajouter un .dll dans Visual Studio 2010 ? Je ne trouve pas cette option.

75voto

gwiazdorrr Points 2872

Sous Windows, vous ne faites pas de lien avec un .dll directement - vous devez utiliser le fichier d'accompagnement .lib à la place. Pour ce faire, allez à Project -> Properties -> Configuration Properties -> Linker -> Additional Dependencies et ajoutez le chemin vers votre .lib à la ligne suivante.

Vous aussi doit assurez-vous que le .dll se trouve soit dans le répertoire contenu par le %PATH% ou que sa copie se trouve dans Output Directory (par défaut, c'est Debug\Release sous le dossier de votre projet).

Si vous n'avez pas accès à la .lib une alternative consiste à charger le fichier .dll manuellement pendant l'exécution à l'aide de fonctions WINAPI telles que LoadLibrary y GetProcAddress .

34voto

ssube Points 8838

Vous n'ajoutez ou ne liez pas directement à une DLL, vous liez à la LIB produite par la DLL.

Une LIB fournit les symboles et autres données nécessaires pour inclure une bibliothèque dans votre code (liaison statique) ou pour faire référence à la DLL (liaison dynamique).

Pour lier un fichier LIB, vous devez l'ajouter à la liste des propriétés du projet -> Linker -> Input -> Additional Dependencies. Tous les fichiers LIB ici seront utilisés dans la liaison. Vous pouvez également utiliser un pragma comme ceci :

#pragma comment(lib, "dll.lib")

Avec la liaison statique, le code est inclus dans votre exécutable et il n'y a pas de dépendances d'exécution. L'établissement de liens dynamiques exige qu'une DLL portant le même nom et les mêmes symboles soit disponible dans l'application. le chemin de recherche (qui est pas juste le chemin ou le répertoire système).

6voto

cmc Points 333

Je trouve utile de comprendre les outils sous-jacents. Ce sont cl.exe (compilateur) et link.exe (éditeur de liens). Vous devez indiquer au compilateur les signatures des fonctions que vous souhaitez appeler dans la bibliothèque dynamique (en incluant l'en-tête de la bibliothèque) et vous devez indiquer à l'éditeur de liens le nom de la bibliothèque et la manière de l'appeler (en incluant la bibliothèque "implib" ou d'importation).

C'est à peu près le même processus que gcc utilise pour lier les bibliothèques dynamiques sur *nix, seul le fichier objet de la bibliothèque diffère.

La connaissance des outils sous-jacents vous permet de trouver plus rapidement les paramètres appropriés dans l'IDE et de vérifier que les lignes de commande générées sont correctes.

Ejemplo

Disons que A.exe dépend de B.dll. Vous devez inclure l'en-tête de B dans A.cpp ( #include "B.h" ) puis compile et lie avec B.lib :

cl A.cpp /c /EHsc
link A.obj B.lib

La première ligne génère A.obj, la seconde génère A.exe. Le site /c indique à cl de ne pas faire de lien et /EHsc spécifie le type de gestion des exceptions C++ que le binaire doit utiliser (il n'y a pas de valeur par défaut, vous devez donc spécifier quelque chose).

Si vous ne spécifiez pas /c cl va appeler link pour vous. Vous pouvez utiliser le /link pour spécifier des arguments supplémentaires à link et faire tout ça en même temps si vous voulez :

cl A.cpp /EHsc /link B.lib

Si B.lib n'est pas sur le INCLUDE vous pouvez lui donner un chemin relatif ou absolu ou ajouter son répertoire parent à votre chemin d'inclusion avec la commande /I drapeau.

Si vous appelez depuis cygwin (comme moi), remplacez les slashs avant par des tirets.

Si vous écrivez #pragma comment(lib, "B.lib") dans A.cpp, vous dites simplement au compilateur de laisser un commentaire dans A.obj indiquant au linker de lier à B.lib. C'est équivalent à spécifier B.lib sur la ligne de commande de liaison.

0voto

JOSEPH BENOY Points 31

Supposons que le fichier source que vous voulez compiler est main.cpp et que votre exemple_dll.dll et exemple_dll.lib . maintenant exécutez cl.exe main.cpp /EHsc /link example_dll.lib maintenant vous pouvez obtenir main.exe

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X