GNU/Linux >> Tutoriels Linux >  >> Linux

Quelle est la signification de l'avertissement :Lier la bibliothèque partagée à la bibliothèque statique n'est pas portable ?

Assurez-vous que les fichiers objets dans libmxml.a ont été construits avec -fPIC . Il est nécessaire de construire une bibliothèque partagée. Voir aussi http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html

Voici un exemple rapide

$ cat stat.c 
int five() { return 5; }
$ gcc -c stat.c -fPIC
$ ar crus libstat.a stat.o
$ cat dynamic.c
int ten() { return five() + five(); }
$ gcc -c dynamic.c -fPIC
$ gcc -shared -o libdyn.so dynamic.o -L. -lstat
$ ldd libdyn.so # Just to show static linkage to libstat.a
  linux-vdso.so.1 =>  (0x00007fffca1b8000)
  libc.so.6 => /lib/libc.so.6 (0x00007fc004649000)
  /lib/ld-linux-x86-64.so.2 (0x00007fc004bf7000)
$ cat main.c 
int main() { return ten(); }
$ gcc main.c -L. -ldyn
$ LD_LIBRARY_PATH=. ./a.out 
$ echo $?
10

Lier des bibliothèques partagées à des bibliothèques statiques n'est pas possible (sauf si vous savez vraiment très bien ce que vous faites). Ne le faites pas.

Le premier avertissement provient de libtool. Il vous indique que l'opération que vous avez demandée fera différentes choses sur différents systèmes et que certaines de ces choses ne sont probablement pas ce que vous voulez. Souvent, cela échouera de diverses manières spectaculaires, car le code qui va dans les bibliothèques partagées et statiques doit être compilé avec différents indicateurs de compilateur.

Le deuxième avertissement provient de gcc. Il vous dit que fournir une bibliothèque statique lors de la compilation est inutile. C'est parce que vous avez $(PATH)/libmxml.a en CFLAGS , où il n'a pas à être. En fait, la plupart du temps, vous ne devriez pas avoir $(PATH)/libmxml.a , mais -L$(PATH) -lmxml Au lieu. Cela devrait toujours aller dans LDFLAGS , mais gcc ne se plaindra pas si cela arrive aussi à la ligne de commande du compilateur.


Lier la bibliothèque partagée libgstmatroskademux.la à la bibliothèque statique

Ceci vous avertit que si vous par ex. essayé de le construire sur Linux 64 bits, cela échouerait probablement. En effet, sur x86_64, tout le code lié à une bibliothèque partagée doit être compilé avec -fPIC drapeau et code qui vit dans .a les bibliothèques ne le sont généralement pas.

gcc :.../libmxml.a :fichier d'entrée de l'éditeur de liens inutilisé car la liaison n'a pas été effectuée

Ceci vous avertit que vous avez une fausse ligne de commande. Très probablement, vous compilez quelque chose et avez -c sur la ligne de commande (qui dit à GCC de s'arrêter après la compilation de la source, et pas effectuer la liaison). Puisque vous fournissez également libmxml.a sur cette même ligne de commande, GCC s'est rendu compte que vous ne savez pas ce que vous faites et vous a averti d'y réfléchir (plus).


Linux
  1. Qu'est-ce que l'astuce LD_PRELOAD ?

  2. Lien statique de la fonction de bibliothèque partagée dans gcc

  3. Quelle est la signification de *nix ?

  4. Quel est l'avantage de __builtin_expect de GCC dans les instructions if else ?

  5. Quels sont les inconvénients des files d'attente de messages de Linux ?

Convertir une bibliothèque statique en bibliothèque partagée ?

Quelle est la signification de POSIX ?

Quels sont les répertoires d'inclusion par défaut de GCC ?

Lier une bibliothèque partagée avec une autre bibliothèque partagée sous Linux

Quelle est la signification d'un double signe dollar dans bash/Makefile ?

Quelle est la signification de curl -k -i -X ​​sous Linux ?