GNU/Linux >> Linux Esercitazione >  >> Linux

Collegamento statico della funzione di libreria condivisa in gcc

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.


Linux
  1. La libreria Libsdl condivisa non si apre?

  2. Libreria condivisa dinamica C++ su Linux

  3. Compilazione dinamica della libreria condivisa con g++

  4. Convertire una libreria statica in una libreria condivisa?

  5. caricamento dinamico della libreria statica?

Come includere la libreria statica nel makefile

Come configurare googleTest come libreria condivisa su Linux

Come può una libreria condivisa (.so) chiamare una funzione implementata nel suo programma di caricamento?

Collegamento di una libreria condivisa con un'altra libreria condivisa in Linux

Ottenere i nomi delle funzioni in una libreria condivisa a livello di codice

Errore durante il caricamento della libreria condivisa (glew)