web-dev-qa-db-fra.com

DLL et fichiers LIB - quoi et pourquoi?

Je connais très peu de choses sur les DLL et les lib, à part le fait qu'ils contiennent le code indispensable au bon fonctionnement d'un programme - des bibliothèques. Mais pourquoi les compilateurs les génèrent-ils? Ne serait-il pas plus simple d'inclure tout le code dans un seul exécutable? Et quelle est la différence entre DLL et LIB?

192
Xonara

Il existe des bibliothèques statiques (LIB) et dynamiques (DLL).

Les bibliothèques sont utilisées parce que vous pouvez avoir du code que vous souhaitez utiliser dans de nombreux programmes. Par exemple, si vous écrivez une fonction qui compte le nombre de caractères dans une chaîne, cette fonction sera utile dans de nombreux programmes. Une fois que cette fonction fonctionne correctement, vous ne souhaitez pas avoir à recompiler le code chaque fois que vous l'utilisez, vous devez donc placer le code exécutable de cette fonction dans une bibliothèque, et l'éditeur de liens peut extraire et insérer le code compilé dans votre programme. . Les bibliothèques statiques sont parfois appelées "archives" pour cette raison.

Les bibliothèques dynamiques vont encore plus loin. Il semble inutile de disposer de plusieurs copies des fonctions de la bibliothèque pour occuper de la place dans chacun des programmes. Pourquoi ne peuvent-ils pas tous partager une copie de la fonction? C'est à cela que servent les bibliothèques dynamiques. Plutôt que de créer le code de bibliothèque dans votre programme lors de sa compilation, vous pouvez l'exécuter en le mappant dans votre programme au fur et à mesure de son chargement en mémoire. Plusieurs programmes exécutés simultanément et utilisant les mêmes fonctions peuvent tous partager une copie et économiser de la mémoire. En fait, vous pouvez charger des bibliothèques dynamiques uniquement selon vos besoins, en fonction du chemin d'accès à votre code. Inutile de demander aux routines d’impression d’occuper de la mémoire si vous n’imprimez rien. D'autre part, cela signifie que vous devez disposer d'une copie de la bibliothèque dynamique installée sur chaque machine sur laquelle votre programme est exécuté. Cela crée son propre ensemble de problèmes.

Par exemple, presque tous les programmes écrits en "C" auront besoin de fonctions provenant d'une bibliothèque appelée "bibliothèque d'exécution C", bien que peu de programmes aient besoin de toutes les fonctions. Le runtime C existe en version statique et dynamique, vous pouvez donc déterminer la version utilisée par votre programme en fonction de vos besoins.

259
Charles E. Grant

Un autre aspect est la sécurité (obscurcissement). Une fois qu'un morceau de code est extrait de l'application principale et inséré dans une bibliothèque de liens dynamiques "séparée", il est plus facile d'attaquer, d'analyser (effectuer un reverse engineering) le code, car il a été isolé. Lorsque le même élément de code est conservé dans une bibliothèque LIB, il fait partie de l’application cible compilée (liée) et il est donc plus difficile d’isoler (différencier) cet élément de code du reste des fichiers binaires cibles.

32
mox

Une raison importante pour créer une DLL/LIB plutôt que de simplement compiler le code dans un exécutable est la réutilisation et le déplacement. La moyenne Java ou .NET (par exemple) utilisera très probablement plusieurs bibliothèques tierces (ou framework). Il est beaucoup plus facile et rapide de simplement compiler avec une bibliothèque pré-construite, Compiler votre code dans des bibliothèques encourage également les bonnes pratiques de conception, par exemple en concevant vos classes pour qu'elles soient utilisées dans différents types d'applications.

13
Andy White

A DLL est une bibliothèque de fonctions qui sont partagées par d'autres programmes exécutables. Il suffit de regarder dans votre répertoire windows/system32 et vous en trouverez des dizaines. Lorsque votre programme crée un DLL il crée également normalement un fichier lib afin que le programme de l'application * .exe puisse résoudre les symboles déclarés dans la DLL.

Un fichier .lib est une bibliothèque de fonctions liées statiquement à un programme - elles ne sont PAS partagées par d'autres programmes. Chaque programme lié à un fichier * .lib contient tout le code de ce fichier. Si vous avez deux programmes A.exe et B.exe qui sont liés à C.lib, chacun d'eux contiendra le code dans C.lib.

La manière dont vous créez les DLL et les bibliothèques dépend du compilateur que vous utilisez. Chaque compilateur le fait différemment.

8
Vinodhini Ramasamy

Une autre différence réside dans la performance.

Comme la DLL est chargée au moment de l’exécution par le .exe (s), le .exe (s) et le DLL fonctionnent avec le concept de mémoire partagée et par conséquent le les performances sont faibles par rapport aux liaisons statiques.

D'autre part, un fichier .lib est un code lié statiquement lors de la compilation à chaque processus demandé. Par conséquent, les fichiers .exe auront une mémoire unique, ce qui augmentera les performances du processus.

4
Girish Reddyvari