Comment puis-je ajouter un .dll
dans Visual Studio 2010 ? Je ne trouve pas cette option.
Réponses
Trop de publicités?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 .
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).
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.