Bonne façon de relier une bibliothèque statique en utilisant GCC

pourquoi certaines bibliothèques statiques (lib*.a) peuvent être liées de la même manière que les bibliothèques partagées (lib*.so) sont liés (commutateur ld-l), mais certains ne le peuvent pas?

j'ai toujours appris que toutes les bibliothèques, statiques ou non, peuvent être reliées avec-L... cependant, j'ai rencontré une bibliothèque JUSQU'à présent (GLFW), qui ne fait que propager des erreurs de lien "référence non définie" si j'essaie de le relier de cette façon.

selon la réponse sur cette question , la" bonne " façon de relier les bibliothèques statiques est de les inclure directement, avec mes propres fichiers d'objets, plutôt que d'utiliser-l. Et, dans le cas de la bibliothèque GLFW, cela résout certainement le problème. Mais toutes les autres bibliothèques statiques que j'utilise fonctionnent très bien lorsqu'elles sont reliées à-L.

:

  • Qu'est-ce qui pourrait empêcher cette bibliothèque de fonctionner lorsqu'elle est reliée plutôt qu'incluse directement? Si je connaissais la cause, peut-être que je pourrais éditez et recompilez la bibliothèque pour corriger le problème.
  • est-il vrai que vous n'êtes pas censé relier des bibliothèques statiques de la même manière que vous liez des bibliothèques partagées? (Et si non, pourquoi pas?)
  • est-ce que le linker est encore capable d'éliminer les fonctions de bibliothèque inutilisées de l'exécutable de sortie lorsque la Bibliothèque est directement incluse de cette façon?
22
demandé sur Community 2012-03-31 05:10:46

4 réponses

Merci pour les réponses! S'avère que le problème était dû à l'ordre des liens. Apparemment, si vous utilisez une bibliothèque qui à son tour a d'autres dépendances de bibliothèque, ces autres dépendances doivent être listées après la Bibliothèque, pas avant comme je l'avais fait. Appris quelque chose de nouveau!

25
répondu Nairou 2012-04-01 21:26:00

la bonne façon de relier une bibliothèque statique est d'utiliser-l, mais cela ne fonctionne que si la bibliothèque peut être trouvée sur le chemin de recherche. Si ce n'est pas le cas, vous pouvez ajouter le répertoire à la liste en utilisant-L ou nommer le fichier par son nom, comme vous le dites.

la même chose est vraie pour les bibliothèques partagées, en fait, bien qu'ils sont plus susceptibles d'être trouvés, peut-être.

6
répondu ams 2012-03-31 13:02:59

avez-vous pris soin d'indiquer au GCC le chemin de votre bibliothèque (en utilisant-L) ? En utilisant uniquement l'option-l, GCC ne pourra relier que les bibliothèques disponibles dans les répertoires standards.

-L[path] -l[lib]
5
répondu Vincent L. 2012-03-31 01:29:05

la raison est historique. L'Outil" ar "était à l'origine l'outil d'archivage de fichiers sur PDP11 unix, bien qu'il ait été remplacé plus tard entièrement par" tar " à cette fin. Il stocke les fichiers (fichiers objet, dans ce cas) dans un paquet. Et il y a une extension séparée contenant la table de symboles pour le linker à utiliser. C'est possible si vous gérez manuellement des fichiers dans l'archive que la table de symboles peut sortir de la date.

La réponse courte est que vous pouvez utiliser la outil "ranlib" sur n'importe quelle archive pour recréer la table de symboles. Essayez que. Plus largement, essayer de comprendre d'où viennent les bibliothèques corrompues et corriger cela.

1
répondu Andy Ross 2012-03-31 04:34:59