Ich verstehe nicht -Wl, -rpath -Wl,

244

Der Einfachheit halber habe ich die entsprechenden Seiten unten hinzugefügt.

Mein (falsches) Verständnis zuerst: Wenn ich Optionen mit trennen ,muss, bedeutet dies, dass die zweite -WlOption keine andere Option ist, da sie vorher kommt, ,was bedeutet, dass sie ein Argument für die -rpathOption ist.

Ich verstehe nicht, wie -rpathman ein -Wl,.Argument haben kann!

Was für mich Sinn machen würde, wäre Folgendes:

-Wl,-rpath .

Dies sollte die Linker-Option -rpath mit dem aktuellen Verzeichnisargument aufrufen.


Mann gcc:

-Wl, Option

Option als Option an den Linker übergeben. Wenn die Option Kommas enthält, wird sie an den Kommas in mehrere Optionen aufgeteilt. Mit dieser Syntax können Sie der Option ein Argument übergeben. Zum Beispiel -Wl,-Map,output.mapgeht -Map output.mapan den Linker. Wenn Sie den GNU-Linker verwenden, können Sie den gleichen Effekt auch mit `-Wl, -Map = output.map 'erzielen.

Mann ld:

-rpath = dir

Fügen Sie dem Suchpfad der Laufzeitbibliothek ein Verzeichnis hinzu. Dies wird verwendet, wenn eine ausführbare ELF-Datei mit gemeinsam genutzten Objekten verknüpft wird. Alle -rpath-Argumente werden verkettet und an den Laufzeitlinker übergeben, der sie zur Laufzeit verwendet, um gemeinsam genutzte Objekte zu finden. Die Option -rpath wird auch verwendet, wenn gemeinsam genutzte Objekte gesucht werden, die von gemeinsam genutzten Objekten benötigt werden, die explizit in der Verknüpfung enthalten sind.

Blub
quelle
2
Fehlt dem Titel nicht am Ende ein Punktzeichen?
Celdor

Antworten:

277

Die -Wl,xxxOption für gcc übergibt eine durch Kommas getrennte Liste von Token als durch Leerzeichen getrennte Liste von Argumenten an den Linker . So

gcc -Wl,aaa,bbb,ccc

wird schließlich ein Linker-Aufruf

ld aaa bbb ccc

In Ihrem Fall möchten Sie " ld -rpath ." sagen , also übergeben Sie dies an gcc als. -Wl,-rpath,.Alternativ können Sie Wiederholungsinstanzen von Folgendem angeben -Wl:

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

Beachten Sie, dass zwischen aaaund dem zweiten kein Komma steht -Wl.

Oder in Ihrem Fall -Wl,-rpath -Wl,..

Kerrek SB
quelle
5
Oh, ich verstehe jetzt, es gibt keine Unterscheidung zwischen Option oder Argument, während Sachen an den Linker übergeben werden, es ist nur eine Zeichenfolge. Der zweite -Wl ist also überflüssig! Danke :)
Blub
29
@Blub: Es ist nicht redundant! Es ist eine alternative Form, sagen Sie entweder -Wl,-rpath,. oder Sie sagen -Wl,-rpath -Wl,.. Genau eines der beiden kann man nichts auslassen.
Kerrek SB
Hat jemand Erfolg gehabt, den Pfad unter OS X festzulegen, dh mit clang & ld64?
Ben-Albrecht
Wie würde die Syntax aussehen, wenn Sie mehrere Pfade angeben möchten? -Wl,-rpath -Wl,. -Wl,-rpath -Wl,/my/lib?
Hintron
1
@Hintron: Ja oder -Wl,-rpath,dir1,-rpath,dir2oder -Wl,-rpath=dir1,-rpath=dir2.
Kerrek SB
63

Du könntest auch schreiben

-Wl,-rpath=.

Um diesen lästigen Raum loszuwerden. Es ist wohl besser lesbar als das Hinzufügen zusätzlicher Kommas (genau das wird an ld übergeben).

Mike
quelle
3
Unter gcc.gnu.org/onlinedocs/gcc/Link-Options.html#Link-Options unter -Wl,option: " Wenn Sie den GNU-Linker verwenden , können Sie den gleichen Effekt auch mit -Wl, -Map = output.map erzielen." Für mich scheint dies darauf hinzudeuten, dass die =Syntax möglicherweise nicht unterstützt wird , wenn Sie einen anderen Linker als den GNU-Linker verwenden .
Hintron
39

Eine andere Sache. Sie können die Option -L angeben müssen auch - zB

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

oder Sie können mit einem Fehler wie enden

ld: cannot find -lbaz
vince
quelle
10

Die Manpage macht es ziemlich klar. Wenn Sie zwei Argumente ( -rpathund .) an den Linker übergeben möchten, können Sie schreiben

-Wl,-rpath,.

oder alternativ

-Wl,-rpath -Wl,.

Die Argumente, die -Wl,-rpath .Sie vorgeschlagen haben, sind für mich NICHT sinnvoll. Woher soll gcc wissen, dass Ihr zweites Argument ( .) an den Linker übergeben werden soll, anstatt normal interpretiert zu werden? Der einzige Weg, dies zu wissen, wäre, wenn es Insiderwissen über alle möglichen Linker-Argumente hätte, so dass es wüsste, dass -rpathein Argument danach erforderlich ist.

David Grayson
quelle
Es ist nicht undenkbar, dass der gcc Argumente analysiert und wenn etwas keinen Sinn ergibt, gruppiert er sich automatisch.
Blub