2017-07-16 1 views
1

J'écris une bibliothèque partagée basée sur libpthread.so. Pour le construire, j'utiliser la commande suivante:Comment inclure des informations de dépendances lors de la création de bibliothèques partagées dans Linux?

gcc -fPIC -shared -lpthread -o libfoo.so foo.c 

Mais lors de la liaison des fichiers qui utilisent libfoo.so, je dois préciser l'option -lpthread -lfoo non seulement -lfoo. En outre, ldd libfoo.so n'affiche rien à propos de libpthread.so.

Alors, y a-t-il un moyen pour que je puisse éviter '-lpthread'?

+4

Votre ligne de commande est dans le mauvais ordre, vous devez mettre les bibliothèques que vous voulez lier avec * last *: 'gcc -fPIC -shared -o libfoo.so foo.c -lpthread' –

+0

Cela fonctionne! Merci beaucoup! – olist

Répondre

0

Extension commentaire de » @Someprogrammerdude:

Votre ligne de commande est dans le mauvais ordre, vous avez besoin de mettre les bibliothèques que vous souhaitez créer un lien avec la dernière: gcc -fPIC -shared -o libfoo.so foo.c -lpthread

je dirais , c'est une mauvaise chose. Les bibliothèques partagées liant d'autres librairies partagées ne sont pas correctes, car:

  • Le programme les utilisant peut également utiliser votre libpthread, mais il peut avoir besoin d'une version différente. Comme les symboles du linker sont globaux (à l'intérieur du processus), lier les multiples versions de la même bibliothèque peut provoquer les bogues les plus terribles et les plus binaires. Considérons que c'est pseudo-aléatoire, quelle version d'un appel de variable globale/api donné sera utilisée. Mais, ce n'est pas un problème d'utiliser une version différente de la même bibliothèque pour laquelle elle a été compilée. La raison en est que les bibliothèques peuvent être compatibles les unes avec les autres, et cela peut être décidé très facilement par une caractéristique relativement nouvelle de la glibc (elle utilise des symboles de liens spéciaux pour décider de la compatibilité).

particulièrement dans la glibc (dont la partie est libpthread) est elle partout le travail à long la compatibilité binaire très important, donc il ne compte pas vraiment, avec libpthread avec vous compilez votre binaire, à l'avenir foreseeble . Et, sinon, cela provoquera des erreurs de liens et non des bugs mystiques.

Ainsi, la solution optimale est:

  1. entièrement loué à libpthread de la liaison de la lib partagée (vous ne avez pas besoin de compiler, vous avez besoin que ses symboles sur l'exécuter)
  2. oui, vous devez donner à la fois -lfoo et -lpthread si vous compilez un binaire en utilisant votre libfoo.

(2) n'est pas un très gros problème - il existe différents outils (comme autoconf gnu) qui peut générer les libs des drapeaux compilateur/éditeur de liens automatiquement.