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.