Comment gcc/ld trouver zlib.de la sorte?
J'ai utilisé la librairie zlib pour les âges et de ne jamais songé au fait qu'il est nommé légèrement de manière non conventionnelle. Alors que la plupart des bibliothèques sur Linux suivre la convention de nommage de lib<name>.so
pour les objets partagés et lib<name>.a
pour les archives, zlib est nommé zlib.so
/zlib.a
. Ma question est: comment fait-gcc/ld savoir rechercher zlib.so
lorsque j'utilise -lz
comme un lien de drapeau?
Je comprends que pour les liaisons, gcc appelle ld, qui effectue des recherches pour les bibliothèques dans certains chemins d'accès par défaut et de tout chemin d'accès spécifié avec -L
, et il ajoute le lib
et .so
ou .a.
parties, en tant que de besoin. Curieusement, gcc est la page de manuel pour relier les options mentionne seulement que l'éditeur de liens peut trouver des archives; il n'y a aucune mention de la .so
extension. Le page de man pour les ld au moins mentionne à la fois les extensions, mais encore, ne mentionne que la recherche en ajoutant lib
à la bibliothèque spécifiée nom. Comment ld sais pour ajouter le lib
après la z
pour zlib? Je n'ai jamais vu cela se produire à une autre bibliothèque.
libz.so
, qui est généralement dans /lib
ou /lib64
, mais peut, dans certaines distributions effectivement /usr/lib[64]
... Si vous avez un zlib.so
que les applications utilisent les applications sont appel dlopen()
, de sorte que la liaison ne se fait pas par ld
(ou ld.so
).devrait-il être une réponse, pas juste un commentaire? Vous avez peut-être frapper le clou sur la tête. Toutefois, quand j'ai utilisé la librairie zlib dans la construction de Matlab mex fonctions, j'ai eu à utiliser
-lzlib
et de fournir un -L
chemin d'accès à un zlib.so
.
OriginalL'auteur patrickvacek | 2013-11-18
Vous devez vous connecter pour publier un commentaire.
gcc
a plusieurs méthodes pour lier les bibliothèques partagées ou statique. Si vous spécifiez-lz
,gcc
est d'aller le chercherlibz.so
(peut-être avec certaines version de bits entre lelibz
et la.so
, mais l'important, c'est le nom de fichier de démarrage aveclibz
et à la fin avec.so
), ou pourlibz.a
(encore une fois, peut-être avec des informations de version) si vous compiler statiquement, ou comme une solution de repli si la bibliothèque partagée n'existe pas. Si vous spécifiez-lzlib
, il va chercher leslibzlib.so
(ce qui n'est pas la norme nom - le paquet est souvent nommézlib
, mais la bibliothèque elle-même estlibz
). Une autre façon de lier serait de ne pas utiliser le-l<lib>
option, et il suffit de spécifier/path/to/zlib.so
ou-L /path/to zlib.so
(ouzlib.a
si vous le souhaitez). Dans ce cas, la bibliothèque ne dispose pas d'avoir lalib
préfixe, mais vous aurez à fournir explicitement toutes les infos de version, à moins que des dispositions sont prises pour un lien symbolique ou quelque chose de similaire à fournir le nom littéralzlib.so
.Applications peuvent également charger des bibliothèques partagées à l'exécution via
dlopen()
et d'autres fonctions connexes, auquel cas la bibliothèque peut également être le nom que vous voulez (cela ne fonctionne pas pour les bibliothèques statiques, bien sûr).Donc, si la bibliothèque est en fait appelé
zlib.so
, alors il n'est pas trouvé pargcc ... -lz
, à moins qu'il arrive juste à être un lien symbolique verslibz.so
(ou vice-versa, dans ce casgcc
est vraiment juste à l'aide delibz.so
, qui arrive à avoir le même contenu que votrezlib.so
). Cependantgcc
peut-être l'utiliser si le processus de construction explicitement les noms de la bibliothèque dans le lien (pas à l'aide de-l<lib>
) ou si votre application charge pardlopen()
(mais dans ce cas, il n'est pas vraiment lié à votre programme - c'est juste chargé au moment de l'exécution).libz.so
variation de l'avant. Vous avez raison à propos de tout cela. Et il s'avère que Matlab est assez intelligent pour trouver deszlib.so
si vous utilisez-zlib
parce qu'il recherche la bibliothèque à la fois avec et sans les préfixerlib
.Oups, le commentaire précédent est censé dire si vous utilisez
-lzlib
. Qui fait la différence!OriginalL'auteur twalberg