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"?
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.
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.