J'essaie de compiler statiquement quelque chose et j'essaie de comprendre quelles sont toutes ces dépendances. Je sais que les fichiers .dll sont destinés aux dépendances liées dynamiquement qui seront requises par la sortie finale, mais que sont les fichiers .a et .lib et quand avez-vous besoin de chacun d'entre eux?
.a est une archive de code: compilé mais non lié. Vous établiriez un lien statique avec lui lors de la dernière étape de liaison de votre programme.
.lib peut être soit le même que .a, soit une soi-disant "bibliothèque d'importation" magique: un espace réservé mince qui vous oblige à exiger un .dll au moment de l'exécution.
Sur les systèmes Unix, vous avez le .a
des dossiers. Ce sont de simples archives de fichiers objets (.o
).
Sous Windows, il existe .lib
fichiers, qui sont tout à fait la même chose, mais pour Windows au lieu d'Unix.
Une subtilité supplémentaire est que pour lier du code à un DLL (sous Windows), vous devez vous lier à un .lib
fichier qui contient des wrappers simples qui invoquent la DLL. Sur le système Unix, traditionnellement, il n'y a pas besoin de tels wrappers (l'éditeur de liens est suffisamment intelligent pour les générer à la volée).
Quelque chose que je ne vois pas encore mentionné ici est le fait surprenant que, au moins parfois, les fichiers .a et .lib sont en fait le même format binaire. Bien que je n'aie rien trouvé qui en dise autant sur le site Web mingw, j'ai remarqué qu'en essayant d'obtenir le compilateur 64 bits de MS Visual C++ cl.exe pour créer un lien dans un fichier .dll produit à l'aide du compilateur mingw-w64 g ++, il était heureux accepté la ligne de commande
cl /EHsc /Ipath\to\include gmp_test.cpp path\to\lib\libgmp.dll.a
et le fichier .exe résultant a fonctionné correctement dès que j'ai mis une copie du fichier .dll correspondant dans le répertoire en cours. (Il a marmonné l'avertissement "Avertissement de ligne de commande D9024: type de fichier source non reconnu 'chemin\vers\lib\gmp-6.0.0\lib\libgmp.dll.a', fichier objet supposé".)
Une autre preuve est que la commande Linux file
a signalé "archive ar actuelle" pour plusieurs fichiers de chaque extension (.lib ou .a) que j'ai essayé.
Habituellement, . A est pour les bibliothèques statiques sous Linux alors que . Lib est pour le même mais sous Windows. Mais bien sûr, ce n'est qu'une convention.