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ù).