GNU/Linux >> Znalost Linux >  >> Linux

Co znamená Varování:Propojení sdílené knihovny se statickou knihovnou není přenosné?

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


Linux
  1. Jaký je trik LD_PRELOAD?

  2. Převést statickou knihovnu na sdílenou?

  3. Statický odkaz funkce sdílené knihovny v gcc

  1. Co znamená *nix?

  2. Jaké jsou nevýhody linuxových front zpráv?

  3. Rozdíl mezi sdílenými objekty (.so), statickými knihovnami (.a) a DLL (.so)?

  1. Propojení sdílené knihovny s jinou sdílenou knihovnou v linuxu

  2. přemístění R_X86_64_32S proti propojování Chyba

  3. Co znamená „černá listina“ na GStreamer?