GNU/Linux >> Znalost Linux >  >> Linux

Statický odkaz funkce sdílené knihovny v gcc

Viz:

http://www.linuxquestions.org/questions/linux-newbie-8/forcing-static-linking-of-shared-libraries-696714/

K propojení potřebujete statickou verzi knihovny.

Sdílená knihovna je ve skutečnosti spustitelný soubor ve speciálním formátu se zadanými vstupními body (a s některými problémy s lepivým řešením). Nemá všechny informace potřebné ke statickému propojení.

Nemůžete staticky propojit sdílenou knihovnu (nebo dynamicky propojit statickou).

Příznak -static vynutí linker používat statické knihovny (.a) místo sdílených (.so). Ale statické knihovny nejsou vždy nainstalovány ve výchozím nastavení, takže možná budete muset nainstalovat statickou knihovnu sami.

Dalším možným přístupem je použití statifikátoru nebo hermelínu. Oba nástroje berou jako vstup dynamicky propojený spustitelný soubor a jako výstup vytvářejí samostatný spustitelný soubor se všemi integrovanými sdílenými knihovnami.


Pokud máte soubor .a vaší sdílené knihovny (.so), můžete jej jednoduše zahrnout s jeho úplnou cestou, jako by to byl soubor objektu, takto:

Toto vygeneruje main.o pouhým zkompilováním:

gcc -c main.c

Tím se tento objektový soubor propojí s odpovídající statickou knihovnou a vytvoří se spustitelný soubor (pojmenovaný "hlavní"):

gcc main.o mylibrary.a -o main

Nebo jedním příkazem:

gcc main.c mylibrary.a -o main

Může to být také absolutní nebo relativní cesta:

gcc main.c /usr/local/mylibs/mylibrary.a -o main

Pokud chcete propojit, řekněte libapplejuice staticky, ale ne, řekněme, liborangejuice , můžete odkazovat takto:

gcc object1.o object2.o -Wl,-Bstatic -lapplejuice -Wl,-Bdynamic -lorangejuice -o binary

Je zde upozornění -- pokud liborangejuice používá libapplejuice a poté libapplejuice budou také dynamicky propojeny.

Budete muset propojit liborangejuice staticky vedle libapplejuice získat libapplejuice statické.

A nezapomeňte ponechat -Wl,-Bdynamic jinak skončíte propojením všeho statického, včetně libc (což není dobrá věc).


Jo, vím, že je to 8 let stará otázka, ale bylo mi řečeno, že je možné staticky odkazovat na knihovnu sdílených objektů, a když jsem o ní hledal další informace, byl to doslova top hit.

Ve skutečnosti demonstrovat, že statické propojení knihovny sdílených objektů není možné pomocí ld (gcc 's linker) – na rozdíl od toho, že jen spousta lidí trvá na tom, že to není možné – použijte následující gcc příkaz:

gcc -o executablename objectname.o -Wl,-Bstatic -l:libnamespec.so

(Samozřejmě budete muset zkompilovat objectname.o od sourcename.c a pravděpodobně byste si také měli vytvořit vlastní knihovnu sdílených objektů. Pokud ano, použijte -Wl,--library-path,. aby ld našel vaši knihovnu v místním adresáři.)

Skutečná chyba, kterou obdržíte, je:

/usr/bin/ld: attempted static link of dynamic object `libnamespec.so'
collect2: error: ld returned 1 exit status

Doufám, že to pomůže.


Linux
  1. Dynamická sdílená knihovna C++ v systému Linux

  2. Kompilace dynamické sdílené knihovny s g++

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

  1. Jak inicializovat sdílenou knihovnu v Linuxu

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

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

  1. Linux – celosystémové monitorování volání do funkce knihovny?

  2. Otevření sdílené knihovny Libsdl se nezdařilo?

  3. Získejte názvy funkcí ve sdílené knihovně programově