Dire a gcc direttamente di collegare staticamente una libreria


133

Mi sembra strano usare -Wl,-Bstaticper dire a gccquali librerie voglio collegarmi staticamente. Dopo tutto, sto raccontando gccdirettamente tutte le altre informazioni sul collegamento con le librerie ( -Ldir, -llibname).

È possibile dire direttamente al driver gcc quali librerie dovrebbero essere collegate staticamente?

Chiarimento: so che se una determinata libreria esiste solo nelle versioni statiche, la utilizzerà senza -Wl,-Bstatic, ma voglio implicare gccdi preferire la libreria statica. So anche che specificare il file di libreria direttamente si collegherebbe con esso, ma preferisco mantenere la semantica per includere le librerie statiche e dinamiche allo stesso modo.

Risposte:


189

Ovviamente è possibile usare -l:invece di -l. Ad esempio -l:libXYZ.aper collegare libXYZ.a. Notare la libscritta, al contrario della -lXYZquale si espanderebbe automaticamente libXYZ.


63
Dio se solo Gnu avesse reso questo il default in primo luogo invece della follia del prefisso lib. Oh il tempo e la frustrazione che avremmo risparmiato.
Timmmm,

9
Radek, questa -l:opzione è documentata? Quale versione di gcc mi serve per usarla?
Osgx,

18
In realtà, è un'opzione del ldlinker sourceware.org/binutils/docs/ld/Options.html " -l namespec.. Se namespec è nel formato: nomefile, cercherà nel percorso della libreria un file chiamato nomefile, altrimenti cercherà nella libreria percorso di un file chiamato libnamespec.a ... sui sistemi ELF .., cercherà una directory in una libreria chiamata libnamespec.so prima di cercarne uno chiamato libnamespec.a ... Nota che questo comportamento non si applica a: nome file , che specifica sempre un file chiamato nome file. ". Since binutils 2.18 - sourceware.org/binutils/docs-2.18/ld/Options.html
osgx

17
GNU non è da nessuna parte responsabile di questa interfaccia, è stata ereditata dalla toolchain di Unix.
Akim

È un vero peccato che non funzioni nei linker non GNU. È un buon modo per "forzare" LDLIBS e opzioni di configurazione simili per trovare librerie statiche senza strane soluzioni con flag di link.
nneonneo,

130

È possibile aggiungere un file .a nel comando di collegamento:

  gcc yourfiles /path/to/library/libLIBRARY.a

Ma questo non sta parlando con il driver gcc, ma con ldlinker come opzioni come -Wl,anythingsono.

Quando dici a gcc o ld -Ldir -lLIBRARY, il linker controllerà sia la versione statica che dinamica della libreria (puoi vedere un processo con -Wl,--verbose). Per modificare l'ordine dei tipi di libreria selezionati è possibile utilizzare -Wl,-Bstatice -Wl,-Bdynamic. Ecco una pagina man di gnu LD: http://linux.die.net/man/1/ld

Per collegare il programma con lib1, lib3 in modo dinamico e lib2 staticamente, utilizzare tale chiamata gcc:

gcc program.o -llib1 -Wl,-Bstatic -llib2 -Wl,-Bdynamic -llib3

Supponendo che l'impostazione predefinita di ld sia l'uso di librerie dinamiche (è su Linux).


3
Versione breve: non c'è modo di farlo con corrente gcc.
Elazar Leibovich,

7
Elazar Leibovich, ma gcc program.o -llib1 -Wl,-Bstatic -llib2 -Wl,-Bdynamic -llib3fa il trucco.
Osgx,

13
Il collegamento (e la ricerca di librerie dyn / static) viene eseguito dal linker, quindi è necessario utilizzare le opzioni del linker. -le -Lsono anche opzioni di linker.
osgx,

3
Questa risposta è stata votata a causa di gcc yourfiles /path/to/library/libLIBRARY.ao -Wl,-Bstatic?
Tor Klingberg,

7
@TorKlingberg, la variante 1 /path/to/library/libLIBRARY.anecessita di un percorso completo per essere scritta, la variante 2 -Wl,-Bstatic -llib2 -Wl,-Bdynamicè solo lunga e aggiunge 2 opzioni extra e assume la modalità predefinita come Bdynamic, e la variante 3 accettata -l:libXYZ.aè breve e funziona semplicemente. Tutti e tre funzioneranno per molti casi e la variante 2 potrebbe non funzionare quando si collegano programmi statici. L'effettivo passaggio di collegamento per la lib è lo stesso in tutte le varianti che ho capito.
osgx,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.