Nie rozumiem -Wl, -rpath -Wl,

244

Dla wygody dodałem odpowiednie strony poniżej.

Moje (błędne) zrozumienie jako pierwsze: jeśli muszę oddzielić opcje ,, oznacza to, że druga -Wlnie jest inną opcją, ponieważ występuje przed nią, ,co oznacza, że ​​jest argumentem dla -rpathopcji.

Nie rozumiem, jak -rpathmożna się -Wl,.kłócić!

Co miałoby sens w moim umyśle to:

-Wl,-rpath .

Powinno to wywołać opcję -rpath linker z argumentem bieżącego katalogu.


man gcc:

-Wl, opcja

Przekaż opcję jako opcję do linkera. Jeśli opcja zawiera przecinki, jest dzielona na wiele opcji w przecinkach. Możesz użyć tej składni, aby przekazać argument do opcji. Na przykład -Wl,-Map,output.mapprzechodzi -Map output.mapdo linkera. Korzystając z GNU linkera, możesz również uzyskać ten sam efekt dzięki `-Wl, -Map = output.map '.

człowiek ld:

-rpath = reż

Dodaj katalog do ścieżki wyszukiwania biblioteki środowiska wykonawczego. Służy to do łączenia pliku wykonywalnego ELF z obiektami współdzielonymi. Wszystkie argumenty -rpath są łączone i przekazywane do łącznika środowiska wykonawczego, który używa ich do lokalizowania obiektów współdzielonych w czasie wykonywania. Opcja -rpath jest także używana podczas lokalizowania obiektów współdzielonych, które są wymagane przez obiekty współdzielone jawnie zawarte w łączu;

Blub
źródło
2
Czy na końcu tytułu nie brakuje kropki?
Celdor

Odpowiedzi:

277

-Wl,xxxOpcja gcc przekazuje listę oddzielonych żetonów jak lista przestrzeni oddzielonych argumentów do łącznika . Więc

gcc -Wl,aaa,bbb,ccc

ostatecznie staje się połączeniem linkera

ld aaa bbb ccc

W twoim przypadku chcesz powiedzieć „ ld -rpath .”, więc przekaż to gcc jako -Wl,-rpath,.Alternatywnie możesz określić powtarzające się wystąpienia -Wl:

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

Zauważ, że nie ma przecinka aaa drugim a drugim-Wl .

Lub, w wypadku -Wl,-rpath -Wl,..

Kerrek SB
źródło
5
Och, rozumiem teraz, nie ma rozróżnienia między opcją lub argumentem podczas przekazywania rzeczy do linkera, to tylko ciąg. Więc drugi -Wl jest zbędny! Dzięki :)
Blub
29
@Blub: To nie jest zbędne! Jest to forma alternatywna, albo mówisz, -Wl,-rpath,. albo mówisz -Wl,-rpath -Wl,.. Dokładnie jeden z dwóch, nie można niczego pominąć.
Kerrek SB
Czy ktoś miał sukces w ustawianiu ścieżki rpath w systemie OS X, tj. W clang & ld64?
ben-albrecht
Jak wyglądałaby składnia, gdybyś chciał podać wiele ścieżek? -Wl,-rpath -Wl,. -Wl,-rpath -Wl,/my/lib?
Hintron
1
@Hintron: Tak, lub -Wl,-rpath,dir1,-rpath,dir2lub -Wl,-rpath=dir1,-rpath=dir2.
Kerrek SB
63

Możesz także pisać

-Wl,-rpath=.

Aby pozbyć się tej nieznośnej przestrzeni. Jest to prawdopodobnie bardziej czytelne niż dodawanie dodatkowych przecinków (dokładnie to, co jest przekazywane do ld).

Mikrofon
źródło
3
Od gcc.gnu.org/onlinedocs/gcc/Link-Options.html#Link-Options pod -Wl,option: „ Korzystając z linkera GNU , możesz również uzyskać ten sam efekt dzięki -Wl, -Map = output.map.” Wydaje mi się, że oznacza to, że jeśli używasz linkera innego niż GNU linker, =składnia może nie być obsługiwana.
Hintron
39

Jeszcze jedna rzecz. Może trzeba będzie określić opcję -L jak również - na przykład

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

lub może wystąpić błąd typu

ld: cannot find -lbaz
Vince
źródło
10

Strona podręcznika wyjaśnia. Jeśli chcesz przekazać dwa argumenty ( -rpathi .) do linkera, możesz napisać

-Wl,-rpath,.

lub alternatywnie

-Wl,-rpath -Wl,.

Argumenty, -Wl,-rpath .które zasugerowałeś, nie mają dla mnie sensu. Skąd gcc ma wiedzieć, że twój drugi argument ( .) powinien być przekazany do linkera zamiast interpretacji normalnej? Jedynym sposobem, w jaki mógłby to wiedzieć, byłoby posiadanie poufnej wiedzy o wszystkich możliwych argumentach linkera, aby wiedział, że -rpathwymaga to argumentu po nim.

David Grayson
źródło
nie jest nie do pomyślenia, że ​​gcc analizuje argumenty, a jeśli coś nie ma sensu, automatycznie grupuje.
Blub