2010-02-25 7 views
29

J'essaye de compiler statiquement quelque chose et j'essaye de comprendre ce que sont ces dépendances. Je sais que les fichiers .dll sont pour les 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?Quelle est la différence entre les fichiers .lib et .a?

Répondre

28

.a est une archive de code: compilé mais pas lié. Vous lieriez statiquement avec elle pendant l'étape de liaison finale de votre programme. .lib peut être soit la même chose que .a, soit une "bibliothèque d'importation" magique: un espace réservé qui vous oblige à avoir un fichier .dll lors de l'exécution.

+0

Je suis en train de compiler le framework QT avec une bibliothèque OpenSSL .a, mais en quelque sorte mon dernier exécutable produit par QT nécessite toujours une DLL OpenSSL externe pour fonctionner. Avez-vous une idée de comment cela pourrait être le cas étant donné que j'utilise une bibliothèque. – Nantucket

+0

Comment le contenu d'OpenSSL .a a-t-il été compilé? Comment liez-vous votre exécutable final? – crazyscot

+0

Je ne suis pas sûr de "exiger un .dll à l'exécution". Vous n'aurez pas besoin de .dll si votre projet utilise des bibliothèques statiques .lib (sauf s'il existe des dépendances .dll que vous n'avez pas identifiées correctement). – ha9u63ar

4

Habituellement, .a est pour les bibliothèques statiques sous Linux alors que .lib sont pour la même chose, mais sur Windows. Mais bien sûr, ce n'est qu'une convention.

19

Sur les systèmes Unix, vous avez les fichiers .a. Ce sont de simples archives de fichiers objets (.o).

Sur 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 à une DLL (sous Windows), vous devez lier avec un fichier .lib 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 assez intelligent pour les générer à la volée).

+0

Merci pour cette réponse, j'ai découvert que j'essayais de compiler avec un drapeau Windows quelque part! :) –

+0

Y a-t-il une différence entre .a créé dans windows et unix? – samnaction

5

Quelque chose que je ne vois pas mentionné ici est le fait surprenant que, au moins une partie du temps, les fichiers. Un fichier .lib sont en fait le même format binaire. Bien que je ne trouvais rien de ce genre sur le site Web de MINGW, j'ai remarqué que lorsque j'essayais d'obtenir le lien vers un compilateur 64 bits de MS Visual C++ cl.exe dans un fichier .dll produit avec le compilateur mingw-w64 g ++, heureusement 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 couru correctement dès que je mets une copie du fichier .dll correspondant dans le répertoire courant. (Il a marmonné l'avertissement "Ligne de commande avertissement D9024: type de fichier source non reconnu" chemin \ vers \ lib \ gmp-6.0.0 \ lib \ libgmp.dll.a ', fichier objet supposé ".)

est que la commande Linux file a rapporté "archive ar actuelle" pour plusieurs fichiers de chaque extension (.lib ou .a) j'ai essayé.

Questions connexes