Ce qui est à l'intérieur.fichier lib de bibliothèque statique, Bibliothèque dynamique liée statiquement et Bibliothèque dynamique liée dynamiquement?
Ce qui est à l'intérieur d'un .fichier lib de bibliothèque statique, Bibliothèque dynamique liée statiquement et Bibliothèque dynamique liée dynamiquement?
comment se fait-il qu'il n'y ait pas besoin d'un .fichier lib dans la Bibliothèque dynamique liée dynamiquement et aussi que dans la liaison statique, le .fichier lib n'est rien mais une .fichier obj avec toutes les méthodes. Est-ce exact?
5 réponses
Pour une bibliothèque statique, l' .fichier lib contient tout le code et les données de la bibliothèque. Le linker identifie alors les bits dont il a besoin et les place dans l'exécutable final.
Pour une bibliothèque dynamique, l' .fichier lib contient une liste des fonctions exportées et des éléments de données de la bibliothèque, et des informations sur laquelle DLL ils proviennent. Lorsque le linker construit l'exécutable final, si l'une des fonctions ou l'un des éléments de données de la bibliothèque sont utilisés, alors le linker ajoute une référence à la DLL (ce qui fait qu'elle est automatiquement chargée par Windows), et ajoute des entrées à la table d'importation de l'exécutable de sorte 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 un, 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 la DLL (et FreeLibrary
lorsque vous avez terminé), et GetProcAddress
pour obtenir le adresse de la fonction ou de l'élément de données dans la DLL. Vous devez ensuite coulé le retour de l'adresse d'un pointeur de fonction pour l'utiliser.
j'ai trouvé la suite réponse de Hans également utile ici.Ça nettoie l'air qu'il pourrait y avoir deux types de fichiers lib.
un fichier LIB est utilisé pour construire votre programme, il n'existe que sur votre build machine et vous ne le navire. Il y a deux sortes. Un lien statique la bibliothèque est un sac de .fichiers obj, réunis en un seul fichier. Le linker sélectionne n'importe quel morceau de code du fichier quand il a besoin de résoudre externe identificateur.
mais plus pertinent pour les DLLs, un fichier LIB peut aussi être une bibliothèque d'importation. Il s'agit alors d'un simple petit fichier qui comprend le nom de la DLL et un liste de toutes les fonctions exportées par la DLL. Vous aurez besoin de fournir il au linker quand vous construisez un programme qui utilise la DLL donc il sait qu'un identifiant externe est en fait une fonction exportée par DLL. Le linker utilise la bibliothèque d'importation pour ajouter des entrées tableau des importations pour L'EXE. Qui est ensuite à son tour utilisé par Windows à exécution de comprendre ce que les Dll doivent être chargés d'exécuter le programme.
Dans une bibliothèque statique, le fichier lib contient l'objet même code 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 à l'exécution.
Je ne suis pas sûr de "bibliothèques dynamiques liées dynamiquement" (chargées programmatiquement). Avez-vous même un lien avec une .lib dans ce cas?
Edit:
un peu en retard à venir, mais non, vous ne liez pas un .lib. Vous êtes relié à la lib avec libraryloaderex dedans. Mais pour la bibliothèque que vous utilisez, vous fournissez vos propres reliures via des pointeurs de fonction C et loadlibrary les remplit.
voici un résumé:
Linking ǁ Static | DLL | LoadLibrary =========ǁ===============|======================|=================== API code ǁ In your com- | In the DLL | In the DLL lives ǁ piled program | | ---------ǁ---------------|----------------------|------------------- Function ǁ Direct, may | Indirect via table | Indirect via your calls ǁ be elided | filled automatically | own function ptrs ---------ǁ---------------|----------------------|------------------- Burden ǁ Compiler | Compiler/OS | You/OS
un fichier lib est lu par le linker et un fichier dll est utilisé pendant l'exécution. Un fichier lib est essentiellement inutile pendant l'exécution et un linker est incapable de lire un fichier dll (sauf peut-être d'une manière non pertinente ici).
les différences entre l'utilisation de fichiers lib pour les liens statiques et dynamiques peuvent être déroutantes, mais si vous comprenez un peu d'histoire, alors cela devient très clair.
à l'origine il y avait seulement des bibliothèques statiques. Pour une bibliothèque statique, l' .fichier lib contient des fichiers obj. Chaque fichier obj est la sortie d'un seul fichier d'entrée de code source du compilateur. Un fichier lib est juste une collection de fichiers obj liés, un peu comme mettre des fichiers obj dans un répertoire. C'est essentiellement ce qu'est un fichier lib est, 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 est dans un fichier séparé l'autre code qu'il utilise.
pour mettre en œuvre dynamic linking, Microsoft a modifié l'utilisation des fichiers lib de sorte qu'ils se réfèrent à un fichier dll au lieu de lieux dans un fichier obj. Autre que cela, toutes les informations dans une bibliothèque pour un lien statique est la même que pour un lien dynamique. Ils sont tous les mêmes dans la mesure où les informations qu'elles contiennent, sauf qu'un fichier lib pour un lien dynamique spécifie le fichier dll.
dans dll sont des" choses " comme dans un exe (il peut y avoir n'importe quel type de données, les importations, les exportations, lire/écrire/sections exécutables), mais la différence est qu'un fichier exe exe exporte seulement le point d'entrée (fonction), mais dll exportation une/plusieurs fonctions.