linux - per - Collegamento statico della funzione di libreria condivisa in gcc




latest g++ (4)

Fare riferimento a:

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

http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.apps/2004-05/0436.html

Hai bisogno di una versione statica della libreria da collegare.

Una libreria condivisa è in realtà un eseguibile in un formato speciale con i punti di ingresso specificati (e alcuni problemi di indirizzamento inclusi). Non ha tutte le informazioni necessarie per collegare staticamente.

Non è possibile collegare staticamente la libreria condivisa (o collegare dinamicamente lo statico)

Flag -static costringerà il linker a utilizzare la libreria statica (.a) anziché condivisa (.so). Le librerie statiche non sono sempre installate di default. Quindi se hai bisogno di un collegamento statico devi installare le librerie statiche.

Un altro possibile approccio è l'uso di statifier o Ermine . Entrambi gli strumenti prendono come input eseguibile collegato dinamicamente e come output creano un eseguibile autonomo con tutte le librerie condivise incorporate.

Come posso collegare staticamente una funzione di libreria condivisa in gcc?


In gcc, questo non è supportato. In realtà, questo non è supportato in nessun compilatore / linker esistente di cui sono a conoscenza.


Se hai il file .a della tua libreria condivisa (.so) puoi semplicemente includerlo con il suo percorso completo come se fosse un file oggetto, come questo:

Questo genera main.o semplicemente compilando:

gcc -c main.c

Questo collega il 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, diciamo, libapplejuice staticamente, ma non, ad esempio, liborangejuice , puoi collegare in questo modo:

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

C'è un avvertimento: se liborangejuice usa libapplejuice , anche libapplejuice sarà collegato dinamicamente.

Dovrai collegare liborangejuice staticamente insieme a libapplejuice per ottenere libapplejuice static di libapplejuice .

E non dimenticare di mantenere -Wl,-Bdynamic altrimenti finirai per collegare tutto ciò che è statico, inclusa la libc (che non è una buona cosa da fare).





gcc