Ujistěte se, že objektové soubory jsou v libmxml.a
byly vytvořeny pomocí -fPIC
. Je nutné vybudovat sdílenou knihovnu. Viz také http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
Zde je rychlý příklad
$ 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
Propojení sdílených knihoven se statickými knihovnami není možné (pokud opravdu moc dobře nevíte, co děláte). Nedělejte to.
První varování je od libtool. Říká vám, že operace, o kterou jste požádali, bude dělat různé věci na různých systémech a některé z těchto věcí pravděpodobně nejsou to, co chcete. Často to prostě selže různými okázalými způsoby, protože kód, který jde do sdílených a statických knihoven, musí být zkompilován s různými příznaky kompilátoru.
Druhé varování je od gcc. Říká vám to poskytnutí statické knihovny při kompilaci je zbytečné. To proto, že máte $(PATH)/libmxml.a
v CFLAGS
, kde nemá co dělat. Ve skutečnosti byste většinou neměli mít $(PATH)/libmxml.a
, ale -L$(PATH) -lmxml
namísto. To by mělo být stále v LDFLAGS
, ale gcc si nebude stěžovat, pokud se to dostane i na příkazový řádek kompilátoru.
Propojení sdílené knihovny libgstmatroskademux.la se statickou knihovnou
Toto vás varuje, že pokud např. zkusili to postavit na 64bitovém Linuxu, pravděpodobně by to selhalo. Je to proto, že na x86_64 veškerý kód, který se propojí do sdílené knihovny, musí být zkompilován s -fPIC
příznak a kód, který žije v .a
knihovny obvykle ne.
gcc:.../libmxml.a:vstupní soubor linkeru není použit, protože propojení nebylo provedeno
Toto vás varuje, že máte falešný příkazový řádek. S největší pravděpodobností něco kompilujete a máte -c
na příkazovém řádku (který říká GCC, aby se po kompilaci zdrojového kódu zastavil a ne provést propojení). Protože dodáváte také libmxml.a
na stejném příkazovém řádku si GCC uvědomilo, že nevíte, co děláte, a varovalo vás, abyste o tom přemýšleli (více).