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
.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.
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.
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).
Merci pour cette réponse, j'ai découvert que j'essayais de compiler avec un drapeau Windows quelque part! :) –
Y a-t-il une différence entre .a créé dans windows et unix? – samnaction
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é.
- 1. Quelle est la différence entre 'a et' _l?
- 2. Quelle est la différence entre dict() et {}?
- 3. Quelle est la différence entre "$^N" et "$ +"?
- 4. Quelle est la différence entre = et: =
- 5. quelle est la différence entre:.! et: r !?
- 6. Quelle est la différence entre ~ et! opérateur?
- 7. Quelle est la différence entre les compléments et les macros?
- 8. Quelle est la différence entre les fonctions NtFsControlFile() et DeviceIoControl()?
- 9. Quelle est la différence entre les tâches AntCall et Ant?
- 10. Quelle est la différence entre les méthodes GET et POST?
- 11. Quelle est la différence entre les paquets android.opengl et javax.microedition.khronos.opengles?
- 12. Quelle est la différence entre ces importations?
- 13. Quelle est la différence entre les schémas W3 et xmlsoap.org?
- 14. Quelle est la différence entre les événements Control.Enter et Control.GotFocus?
- 15. Quelle est la différence entre les spécifications JPA et JDO?
- 16. Quelle est la différence entre les interfaces IComparable et IEquatable?
- 17. Quelle est la différence entre les objets Session et Application?
- 18. Quelle est la différence entre les schémas « :: » et « sys »?
- 19. Quelle est la différence entre les JNDI LDAP et FileSystem?
- 20. Quelle est la différence entre double a = a + int b et int a + = double b?
- 21. Quelle est la différence entre l'extension et zend_extension dans php.ini?
- 22. autoit: quelle est la différence entre inetget et inetread
- 23. Quelle est la différence entre PATH_NOT_FOUND et NAME_NOT_FOUND
- 24. Quelle est la différence entre le format OMF et COFF?
- 25. Quelle est la relation entre .lib et .obj entre eux et mon projet en C++?
- 26. Quelle est la différence entre armv6 et i386?
- 27. Quelle est la différence entre "fonction" et "fonction!" dans VIM?
- 28. Quelle est la différence entre AxInterop et Interop?
- 29. Quelle est la différence entre ResolveUrl et ResolveClientUrl?
- 30. Quelle est la différence entre truncate table A et Supprimer A
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
Comment le contenu d'OpenSSL .a a-t-il été compilé? Comment liez-vous votre exécutable final? – crazyscot
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