GNU/Linux >> Linux Esercitazione >  >> Linux

Qual è il significato di Avvertenza:il collegamento della libreria condivisa alla libreria statica non è portabile?

Assicurati che i file oggetto in libmxml.a sono stati creati con -fPIC . È necessario costruire una libreria condivisa. Vedi anche http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html

Ecco un rapido esempio

$ 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

Il collegamento di librerie condivise a librerie statiche non è possibile (a meno che tu non sappia davvero molto bene cosa stai facendo). Non farlo.

Il primo avvertimento è da libtool. Ti dice che l'operazione che hai richiesto farà cose diverse su sistemi diversi e alcune di queste cose probabilmente non sono ciò che desideri. Spesso fallirà in vari modi spettacolari, perché il codice che va nelle librerie condivise e statiche deve essere compilato con diversi flag del compilatore.

Il secondo avviso è di gcc. Ti sta dicendo che fornire una libreria statica durante la compilazione è inutile. Questo perché hai $(PATH)/libmxml.a in CFLAGS , dove non ha interesse ad essere. In effetti, la maggior parte delle volte non dovresti hanno $(PATH)/libmxml.a , ma -L$(PATH) -lmxml invece. Dovrebbe comunque andare in LDFLAGS , ma gcc non si lamenterà se questo arriva anche alla riga di comando del compilatore.


Collegamento della libreria condivisa libgstmatroskademux.la alla libreria statica

Questo ti avverte che se ad es. provato a crearlo su Linux a 64 bit, probabilmente fallirebbe. Questo perché su x86_64, tutto il codice che viene collegato a una libreria condivisa deve essere compilato con -fPIC flag e codice che risiede in .a le librerie di solito non lo sono.

gcc:.../libmxml.a:file di input del linker inutilizzato perché il collegamento non è stato eseguito

Questo ti avverte che hai una riga di comando fasulla. Molto probabilmente stai compilando qualcosa e hai -c sulla riga di comando (che dice a GCC di fermarsi dopo aver compilato il sorgente, e non eseguire il collegamento). Poiché stai fornendo anche libmxml.a sulla stessa riga di comando, GCC si è reso conto che non sai cosa stai facendo e ti ha avvertito di pensarci (di più).


Linux
  1. Qual è il trucco LD_PRELOAD?

  2. Convertire una libreria statica in una libreria condivisa?

  3. Collegamento statico della funzione di libreria condivisa in gcc

  4. Quali sono le directory di inclusione predefinite di GCC?

  5. Quali sono gli svantaggi delle code di messaggi di Linux?

Qual è il significato di *nix?

Qual è il vantaggio di __builtin_expect di GCC nelle istruzioni if ​​else?

riposizionamento R_X86_64_32S contro errore di collegamento

Qual è il significato di "lista nera" su GStreamer?

Come elencare le dipendenze della libreria statica c/c++?

Qual è il significato di curl -k -i -X ​​in Linux?