Que contient un fichier .lib d'une bibliothèque statique, d'une bibliothèque dynamique liée statiquement et d'une bibliothèque dynamique liée dynamiquement?
Comment se fait-il qu'il n'y ait pas besoin d'un fichier .lib dans une bibliothèque dynamique liée dynamiquement et aussi que dans une liaison statique, le fichier .lib n'est rien d'autre qu'un fichier .obj avec toutes les méthodes. Est-ce exact?
Pour une bibliothèque statique, le fichier .lib contient tout le code et les données de la bibliothèque. L'éditeur de liens identifie ensuite les bits dont il a besoin et les place dans l'exécutable final.
Pour une bibliothèque dynamique, le fichier .lib contient une liste des fonctions exportées et des éléments de données de la bibliothèque, ainsi que des informations sur la provenance de DLL. Lorsque l'éditeur de liens crée l'exécutable final, alors si n'importe laquelle des fonctions ou des éléments de données de la bibliothèque est utilisée, puis l'éditeur de liens ajoute une référence à DLL (provoquant son chargement automatique par Windows) et ajoute des entrées à la table d'importation de l'exécutable afin qu'un appel à la fonction est redirigé dans cette DLL.
Vous n'avez pas besoin d'un fichier .lib pour utiliser une bibliothèque dynamique, mais sans celui-ci, vous ne pouvez pas traiter les fonctions de la DLL comme des fonctions normales dans votre code. Au lieu de cela, vous devez appeler manuellement LoadLibrary
pour charger le DLL (et FreeLibrary
lorsque vous avez terminé), et GetProcAddress
pour obtenir l'adresse de la fonction ou de l'élément de données dans la DLL Vous devez ensuite convertir l'adresse renvoyée en un pointeur vers une fonction appropriée pour l'utiliser.
J'ai trouvé que la suite réponse de Hans était également utile ici.
Un fichier LIB est utilisé pour construire votre programme, il n'existe que sur votre machine de build et vous ne le livrez pas. Il en existe deux sortes. Une bibliothèque de liens statiques est un sac de fichiers .obj, collectés dans un seul fichier. L'éditeur de liens sélectionne tous les morceaux de code du fichier lorsqu'il doit résoudre un identifiant externe.
Mais plus pertinent pour les DLL, un fichier LIB peut également être une bibliothèque d'importation. Il s'agit alors d'un simple petit fichier qui inclut le nom du DLL et une liste de toutes les fonctions exportées par la DLL. Vous devrez le fournir à l'éditeur de liens lorsque vous construisez un programme qui utilise le DLL afin qu'il sache qu'un identifiant externe est en fait une fonction exportée par la DLL. L'éditeur de liens utilise la bibliothèque d'importation pour ajouter des entrées à la table d'importation pour l'EXE. Qui se trouve alors dans tour utilisé par Windows au moment de l'exécution pour déterminer quelles DLL doivent être chargées pour exécuter le programme.
Dans une bibliothèque statique, le fichier lib contient le code objet réel pour les fonctions fournies par la bibliothèque. Dans la version partagée (ce que vous avez appelé la bibliothèque dynamique liée statiquement), il y a juste assez de code pour établir la liaison dynamique au moment de l'exécution.
Je ne suis pas sûr des "bibliothèques dynamiques liées dynamiquement" (chargées par programme). Avez-vous même un lien avec un .lib dans ce cas?
Modifier:
Un peu tard, mais non, vous ne liez pas un .lib. Eh bien, vous créez un lien vers la bibliothèque contenant libraryloaderex. Mais pour la bibliothèque que vous utilisez, vous fournissez vos propres liaisons via des pointeurs de fonction C et la bibliothèque de chargement les remplit.
Voici un résumé:
Liaison ǁ Statique | DLL | LoadLibrary ========= ǁ =============== | ======= =============== | =================== Code API ǁ Dans votre com- | Dans le DLL | Dans la DLL Vit ǁ programme empilé | | --------- ǁ ---------- ----- | ---------------------- | ------------------- Fonction ǁ Direct, peut | Indirect via le tableau | Indirect via vos Appels ǁ être élidé | rempli automatiquement | propres fonctions ptrs --------- ǁ --- ------------ | ---------------------- | -------------- ----- Charge ǁ Compilateur | Compilateur/OS | Vous/OS
Un fichier lib est lu par l'éditeur de liens et un fichier dll est utilisé pendant l'exécution. Un fichier lib est essentiellement inutile pendant l'exécution et un éditeur de liens est incapable de lecture un fichier dll (sauf peut-être d'une manière non pertinente ici).
Les différences entre l'utilisation des fichiers lib pour les liens statiques et dynamiques peuvent être déroutantes, mais si vous comprenez un peu d'histoire, cela devient très clair.
À l'origine, il n'y avait que des bibliothèques statiques. Pour une bibliothèque statique, le fichier .lib contient des fichiers obj. Chaque fichier obj est la sortie d'un et d'un seul fichier d'entrée de code source du compilateur. Un fichier lib est juste une collection de fichiers obj associés, un peu comme placer des fichiers obj dans un répertoire. C'est essentiellement ce qu'est un fichier lib, une bibliothèque de fichiers obj. Pour un lien statique, tous les fichiers obj qu'un exécutable utilise sont combinés en un seul fichier. Comparez cela à un lien dynamique dans lequel l'exécutable se trouve dans un fichier distinct de l'autre code qu'il utilise.
Pour implémenter la liaison dynamique, Microsoft a modifié l'utilisation des fichiers lib afin qu'ils se réfèrent à un fichier dll au lieu d'emplacements dans un fichier obj. En dehors de cela, toutes les informations contenues dans une bibliothèque pour un lien statique sont les mêmes que pour un lien dynamique. Ils sont tous les mêmes en ce qui concerne les informations qu'ils contiennent sauf qu'un fichier lib pour un lien dynamique spécifie le fichier dll.
Dans les dll, il y a des "choses" comme dans un exe (il peut y avoir n'importe quel type de données, d'importations, d'exportations, de sections lecture/écriture/exécutable) mais la différence est qu'un fichier exe exporte uniquement le point d'entrée (fonction) mais l'export de dll/de nombreuses fonctions.