Dla wygody dodałem odpowiednie strony poniżej.
Moje (błędne) zrozumienie jako pierwsze: jeśli muszę oddzielić opcje ,
, oznacza to, że druga -Wl
nie jest inną opcją, ponieważ występuje przed nią, ,
co oznacza, że jest argumentem dla -rpath
opcji.
Nie rozumiem, jak -rpath
moż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.map
przechodzi-Map output.map
do 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;
Odpowiedzi:
-Wl,xxx
Opcja gcc przekazuje listę oddzielonych żetonów jak lista przestrzeni oddzielonych argumentów do łącznika . Więcostatecznie staje się połączeniem linkera
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
:Zauważ, że nie ma przecinka
aaa
drugim a drugim-Wl
.Lub, w wypadku
-Wl,-rpath -Wl,.
.źródło
-Wl,-rpath,.
albo mówisz-Wl,-rpath -Wl,.
. Dokładnie jeden z dwóch, nie można niczego pominąć.-Wl,-rpath -Wl,. -Wl,-rpath -Wl,/my/lib
?-Wl,-rpath,dir1,-rpath,dir2
lub-Wl,-rpath=dir1,-rpath=dir2
.Możesz także pisać
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).
źródło
-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.Jeszcze jedna rzecz. Może trzeba będzie określić opcję -L jak również - na przykład
lub może wystąpić błąd typu
źródło
Strona podręcznika wyjaśnia. Jeśli chcesz przekazać dwa argumenty (
-rpath
i.
) do linkera, możesz napisaćlub alternatywnie
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-rpath
wymaga to argumentu po nim.źródło