Risposte:
Fare riferimento a:
http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.apps/2004-05/0436.html
È necessaria la versione statica della libreria per collegarla.
Una libreria condivisa è in realtà un eseguibile in un formato speciale con punti di ingresso specificati (e alcuni problemi di indirizzamento inclusi). Non ha tutte le informazioni necessarie per collegarsi staticamente.
Non è possibile collegare staticamente una libreria condivisa (o collegare dinamicamente una libreria statica).
Il flag -static
imporrà al linker di utilizzare librerie statiche (.a) anziché 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 è quello di utilizzare statizer o Ermine . Entrambi gli strumenti prendono come input un eseguibile collegato dinamicamente e come output creano un eseguibile autonomo con tutte le librerie condivise incorporate.
Se vuoi collegare, diciamo, libapplejuice staticamente, ma non, diciamo, liborangejuice , puoi collegarti in questo modo:
gcc object1.o object2.o -Wl,-Bstatic -lapplejuice -Wl,-Bdynamic -lorangejuice -o binary
C'è un avvertimento: se gli liborangejuice
usi libapplejuice
, allora libapplejuice
saranno anche collegati dinamicamente.
Dovrai collegarti liborangejuice
staticamente insieme a libapplejuice
per ottenere libapplejuice
statico.
E non dimenticare di mantenere -Wl,-Bdynamic
altrimenti finirai per collegare tutto ciò che è statico, incluso libc
(che non è una buona cosa da fare).
gcc -o main main.cc -Wl,-rpath=. -Wl,-Bdynamic -lB -Wl,-Bstatic -lA -Wl,-Bdynamic -L.
libB usa libA , è collegato e ldd
non mostra un riferimento a libA . L'eseguibile funziona bene. Testato con g ++ 4.7.3.
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 quel file oggetto con la corrispondente libreria statica e crea l'eseguibile (chiamato "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
Sì, so che questa è una domanda di 8 anni, ma mi è stato detto che era possibile collegarsi staticamente a una libreria di oggetti condivisi e questo è stato letteralmente il successo maggiore quando ho cercato ulteriori informazioni al riguardo.
Per dimostrare effettivamente che non è possibile collegare staticamente una libreria di oggetti condivisi con ld
( gcc
linker di) - al contrario di un gruppo di persone che insistono sul fatto che non è possibile - utilizzare il seguente gcc
comando:
gcc -o executablename objectname.o -Wl,-Bstatic -l:libnamespec.so
(Naturalmente dovrete compilare objectname.o
da sourcename.c
, e, probabilmente, si dovrebbe fare il proprio libreria condivisa oggetto pure. Se lo fai, l'uso -Wl,--library-path,.
in modo che ld possa trovare la 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 che aiuti.
Un po 'in ritardo ma ... ho trovato un link che ho salvato un paio di anni fa e ho pensato che potesse essere utile per voi ragazzi:
CDE: crea automaticamente applicazioni Linux portatili
http://www.pgbovine.net/cde.html
Eseguire il binario passando come argomento il nome del binario che si desidera rendere portatile, ad esempio: nmap
./cde_2011-08-15_64bit nmap
Il programma leggerà tutte le librerie collegate a nmap e alle sue dipendenze e le salverà tutte in una cartella chiamata cde-package / (nella stessa directory in cui ci si trova).
Ricorda, per avviare il programma portatile devi eseguire il binario che si trova in cde-package / nmap.cde
I migliori saluti
In gcc, questo non è supportato. In realtà, questo non è supportato in nessun compilatore / linker esistente di cui sono a conoscenza.