web-dev-qa-db-fra.com

Liaison de dll dans Visual Studio

Comment puis-je ajouter un .dll dans Visual Studio 2010? Je ne peux tout simplement pas trouver l'option ici.

25
smallB

Sous Windows, vous ne liez pas directement avec un fichier .dll - vous devez utiliser le fichier .lib qui le contient. Pour ce faire, accédez à Project -> Properties -> Configuration Properties -> Linker -> Additional Dependencies et ajoutez le chemin d'accès à votre fichier .lib en tant que ligne suivante. 

Vous devez également must vous assurer que le fichier .dll se trouve dans le répertoire contenu dans la variable d'environnement %PATH% ou que sa copie se trouve dans Output Directory (par défaut, il s'agit de Debug\Release dans le dossier de votre projet).

Si vous n'avez pas accès au fichier .lib, vous pouvez également charger le .dll manuellement lors de l'exécution à l'aide de fonctions WINAPI telles que LoadLibrary et GetProcAddress .

43
gwiazdorrr

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

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

Pour lier une LIB, vous devez l'ajouter à la liste Propriétés du projet -> Éditeur de liens -> Entrée -> Dépendances supplémentaires. Tous les fichiers LIB ici seront utilisés pour la liaison. Vous pouvez aussi 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’ya aucune dépendance à l’exécution. La liaison dynamique nécessite que DLL avec le nom et les symboles correspondants soit disponible dans le chemin de recherche (qui est pas uniquement le chemin ou le répertoire système).

21
ssube

Je trouve utile de comprendre les outils sous-jacents. Ce sont cl.exe (compilateur) et link.exe (éditeur de lien). 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 comment la bibliothèque est appelée et comment l'appeler (en incluant le "implib" ou bibliothèque d'importation).

C’est à peu près le même processus que celui utilisé par gcc pour la liaison à des bibliothèques dynamiques sur * nix, seul le fichier d’objet de bibliothèque diffère.

Connaître les outils sous-jacents signifie que vous pouvez trouver plus rapidement les paramètres appropriés dans IDE et vous permettre de vérifier que les lignes de commande générées sont correctes.

Exemple

Dites A.exe dépend de B.dll. Vous devez inclure l'en-tête de B dans A.cpp (#include "B.h"), puis compiler et lier 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. L'indicateur /c indique à cl de ne pas créer de lien et /EHsc spécifie le type d'exception 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 appellera link pour vous. Vous pouvez utiliser l'indicateur /link pour spécifier des arguments supplémentaires à link et le faire tous en même temps si vous le souhaitez:

cl A.cpp /EHsc /link B.lib

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

Si vous appelez de cygwin (comme je le fais), remplacez les barres obliques 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, en demandant à l'éditeur de liens de créer un lien vers B.lib. Cela équivaut à spécifier B.lib sur la ligne de commande du lien.

2
cmc