Non capisco -Wl, -rpath -Wl,


245

Per comodità ho aggiunto le relative manpage di seguito.

La mia (mis) comprensione prima: se ho bisogno di separare le opzioni con ,, ciò significa che la seconda -Wlnon è un'altra opzione perché viene prima, il ,che significa che è un argomento per l' -rpathopzione.

Non capisco come si -rpathpossa avere una -Wl,.discussione!

Ciò che avrebbe senso nella mia mente sarebbe questo:

-Wl,-rpath .

Questo dovrebbe invocare l'opzione -rpath linker con l'argomento directory corrente.


man gcc:

-Wl, opzione

Passa opzione come opzione al linker. Se l'opzione contiene virgole, viene suddivisa in più opzioni tra virgole. È possibile utilizzare questa sintassi per passare un argomento all'opzione. Ad esempio, -Wl,-Map,output.mappassa -Map output.mapal linker. Quando si utilizza il linker GNU, è anche possibile ottenere lo stesso effetto con `-Wl, -Map = output.map '.

man ld:

-rpath = dir

Aggiungi una directory al percorso di ricerca della libreria di runtime. Viene utilizzato quando si collega un eseguibile ELF con oggetti condivisi. Tutti gli argomenti -rpath vengono concatenati e passati al linker di runtime, che li utilizza per individuare gli oggetti condivisi in fase di runtime. L'opzione -rpath viene utilizzata anche per individuare oggetti condivisi necessari per gli oggetti condivisi esplicitamente inclusi nel collegamento;


2
Alla fine il titolo non presenta il carattere punto?
Celdor,

Risposte:


278

L' -Wl,xxxopzione per gcc passa un elenco di token separati da virgola come elenco di argomenti separato da spazi al linker . Così

gcc -Wl,aaa,bbb,ccc

alla fine diventa una chiamata linker

ld aaa bbb ccc

Nel tuo caso, vuoi dire " ld -rpath .", quindi passi questo a gcc come -Wl,-rpath,.In alternativa, puoi specificare le ripetizioni di -Wl:

gcc -Wl,aaa -Wl,bbb -Wl,ccc

Si noti che non esiste una virgola tra aaae il secondo -Wl.

O, nel tuo caso -Wl,-rpath -Wl,.,.


5
Oh, capisco ora, non c'è discriminazione tra opzione o argomento mentre si passa roba al linker, è solo una stringa. Quindi il secondo -Wl è ridondante! Grazie :)
Blub,

29
@Blub: non è ridondante! È una forma alternativa, o dici -Wl,-rpath,. o dici -Wl,-rpath -Wl,.. Proprio uno dei due, non puoi omettere nulla.
Kerrek SB,

Qualcuno ha avuto successo nell'impostare il percorso su OS X, cioè con clang & ld64?
ben-albrecht,

Come sarebbe la sintassi se si desidera specificare più percorsi? -Wl,-rpath -Wl,. -Wl,-rpath -Wl,/my/lib?
Hintron,

1
@Hintron: Sì, oppure -Wl,-rpath,dir1,-rpath,dir2oppure -Wl,-rpath=dir1,-rpath=dir2.
Kerrek SB

63

Potresti anche scrivere

-Wl,-rpath=.

Per sbarazzarsi di quel fastidioso spazio. È probabilmente più leggibile dell'aggiunta di virgole extra (è esattamente ciò che viene passato a ld).


3
Da gcc.gnu.org/onlinedocs/gcc/Link-Options.html#Link-Options in -Wl,option: " Quando si utilizza il linker GNU , è anche possibile ottenere lo stesso effetto con -Wl, -Map = output.map." A mio avviso, ciò sembra indicare che se si utilizza un linker diverso dal linker GNU, la =sintassi potrebbe non essere supportata.
Hintron,

39

Un'altra cosa Potrebbe essere necessario specificare l'opzione -L come pure - per esempio

-Wl,-rpath,/path/to/foo -L/path/to/foo -lbaz

o potresti finire con un errore come

ld: cannot find -lbaz

10

La pagina man lo rende abbastanza chiaro. Se vuoi passare due argomenti ( -rpathe .) al linker puoi scrivere

-Wl,-rpath,.

o in alternativa

-Wl,-rpath -Wl,.

Gli argomenti che -Wl,-rpath .hai suggerito NON hanno senso per la mia mente. Come dovrebbe gcc sapere che il tuo secondo argomento ( .) dovrebbe essere passato al linker invece di essere interpretato normalmente? L'unico modo in cui sarebbe in grado di sapere che è se avesse una conoscenza privilegiata di tutti i possibili argomenti del linker, quindi sapeva che -rpathdopo ciò era necessario un argomento.


non è impensabile che gcc analizzi gli argomenti e se qualcosa non ha senso, si raggruppa automaticamente.
Blub,
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.