Fare riferimento a:
http://www.linuxquestions.org/questions/linux-newbie-8/forcing-static-linking-of-shared-libraries-696714/
Hai bisogno della versione statica della libreria per collegarla.
Una libreria condivisa è in realtà un eseguibile in un formato speciale con punti di ingresso specificati (e inclusi alcuni problemi di indirizzamento appiccicoso). Non ha tutte le informazioni necessarie per collegarsi staticamente.
Non puoi collegare staticamente una libreria condivisa (o dinamicamente collegarne una statica).
La bandiera -static
costringerà il linker a utilizzare le librerie statiche (.a) invece di quelle condivise (.so). Ma le librerie statiche non sono sempre installate per impostazione predefinita, quindi potresti dover installare tu stesso la libreria statica.
Un altro possibile approccio è usare statifier o Ermine. Entrambi gli strumenti accettano come input un eseguibile collegato dinamicamente e come output creano un eseguibile autonomo con tutte le librerie condivise incorporate.
Se hai il file .a della tua libreria condivisa (.so) puoi semplicemente includerlo con il suo percorso completo come se fosse un file oggetto, in questo modo:
Questo genera main.o semplicemente compilando:
gcc -c main.c
Questo collega quel file oggetto con la libreria statica corrispondente e crea l'eseguibile (denominato "main"):
gcc main.o mylibrary.a -o main
O in un singolo comando:
gcc main.c mylibrary.a -o main
Potrebbe anche essere un percorso assoluto o relativo:
gcc main.c /usr/local/mylibs/mylibrary.a -o main
Se vuoi collegare, dì, libapplejuice staticamente, ma non, ad esempio, liborangejuice , puoi collegarti in questo modo:
gcc object1.o object2.o -Wl,-Bstatic -lapplejuice -Wl,-Bdynamic -lorangejuice -o binary
C'è un avvertimento:se liborangejuice
utilizza libapplejuice
, quindi libapplejuice
saranno anch'essi collegati dinamicamente.
Dovrai collegare liborangejuice
staticamente accanto a libapplejuice
per ottenere libapplejuice
statico.
E non dimenticare di tenere -Wl,-Bdynamic
altrimenti finirai per collegare tutto ciò che è statico, incluso libc
(che non è una buona cosa da fare).
Sì, so che questa è una domanda vecchia di 8 anni, ma mi è stato detto che era possibile collegarsi staticamente a una libreria di oggetti condivisi e questo è stato letteralmente il massimo successo quando ho cercato ulteriori informazioni a riguardo.
Per dimostrare effettivamente che il collegamento statico di una libreria di oggetti condivisi non è possibile con ld
(gcc
linker di) -- al contrario di un gruppo di persone che insistono sul fatto che non è possibile -- usa il seguente gcc
comando:
gcc -o executablename objectname.o -Wl,-Bstatic -l:libnamespec.so
(Naturalmente dovrai compilare objectname.o
da sourcename.c
, e dovresti probabilmente creare anche la tua libreria di oggetti condivisi. Se lo fai, usa -Wl,--library-path,.
in modo che ld possa trovare la tua libreria nella directory locale.)
L'errore effettivo che ricevi è:
/usr/bin/ld: attempted static link of dynamic object `libnamespec.so'
collect2: error: ld returned 1 exit status
Spero di esserti stato d'aiuto.