web-dev-qa-db-fra.com

C ++: Que fait réellement le commentaire #pragma (lib, "XXX") avec "XXX"?

Mon expérience est C # mais je dois maintenir un héritage (MS) C++. Dans cette base de code, je suis tombé sur:

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

où 700 est une version. Outre la lib est un DLL avec le même nom.

J'ai d'abord pensé que le programme dépendrait du DLL mais après l'avoir supprimé du système, le programme fonctionne toujours. Il existe cependant une version plus récente de la DLL, nommée OtherLib900 .. .

Il semble que le programme ait "inclus" le code de la lib afin qu'il ne dépende plus de la DLL externe. (Ou que le programme utilise "automatiquement" la DLL la plus récente ...)

Laquelle est correcte? Existe-t-il un moyen de confirmer davantage cette "hypothèse"?

28
steglig

Si un programme a ce pragma, il recherchera la bibliothèque OtherLib700.lib. S'il s'agit d'une bibliothèque d'importation lorsque le programme est chargé, Windows recherchera OtherLib700.dll Sur le chemin. Il n'essaiera pas de rechercher OtherLib900.dll pendant l'exécution, il doit donc trouver votre dll dans un dossier différent. Cela suppose que OtherLib700.lib est une bibliothèque d'importation et non une bibliothèque statique. Si OtherLib700.lib est une bibliothèque statique, c'est tout ce dont elle a besoin.

6
drescherjm

Ce pragma est utilisé pour établir un lien avec le fichier .lib Spécifié. Il s'agit d'une alternative à la spécification de la bibliothèque dans le champ des dépendances externes dans les paramètres du projet.

Généralement, il est utilisé pour prendre en charge différentes versions:

#ifdef USE_FIRST_VERSION
#pragma comment(lib, "vers1.lib")
#else
#pragma comment(lib, "vers2.lib")
#endif

Lorsque votre application utilise une bibliothèque liée dynamiquement, un fichier lib vous informe sur les symboles qui sont exportés dans le dll. Donc, fondamentalement, vous n'avez besoin que de lib pour compiler et lier, mais vous avez besoin de dll pour exécuter le programme, car il contient tout le code binaire.

Vous dites qu'il y a un dll associé, ce qui indique généralement que le fichier lib ne contient que des informations de liaison et aucun code. Vous devriez obtenir une erreur d'exécution si le dll associé n'a pas été trouvé. Vous pouvez vérifier avec MSVS si une version différente de dll a été chargée ou si elle a été chargée à partir d'un autre emplacement.

49
Luchian Grigore