Я не розумію -Wl, -rpath -Wl,


244

Для зручності я додав відповідні вказівки нижче.

Моє (неправильне) розуміння перше: Якщо мені потрібно розділити варіанти ,, це означає, що другий -Wlне є іншим варіантом, тому що він виходить перед тим, ,що означає, що це аргумент -rpathваріанту.

Я не розумію, як -rpathможна -Wl,.аргументувати!

Який би сенс мав на увазі таке:

-Wl,-rpath .

Це повинно викликати параметр -rpath linker з аргументом поточного каталогу.


man gcc:

-Wl, варіант

Передати опцію як опцію для лінкера. Якщо опція містить коми, вона розділяється на кілька варіантів. Ви можете використовувати цей синтаксис для передачі аргументу параметру. Наприклад, -Wl,-Map,output.mapпереходить -Map output.mapдо лінкера. Використовуючи лінкер GNU, ви також можете отримати той же ефект із `-Wl, -Map = output.map '.

man ld:

-rpath = реж

Додайте каталог до шляху пошуку бібліотеки часу виконання. Це використовується, коли пов'язується виконуваний файл ELF із спільними об'єктами. Всі аргументи-rpath об'єднуються і передаються в лінкер виконання, який використовує їх для пошуку спільних об'єктів під час виконання. Параметр -rpath також використовується при пошуку спільних об'єктів, необхідних спільним об'єктам, явно включеним у посилання;


2
Чи не в заголовку відсутній символ крапки в кінці?
Celdor

Відповіді:


277

-Wl,xxxВаріант для GCC проходить через кому список токенов в якості розділених пробілами список аргументів линкера . Так

gcc -Wl,aaa,bbb,ccc

врешті-решт стає викликом зв’язку

ld aaa bbb ccc

У вашому випадку ви хочете сказати " ld -rpath .", тож передаєте це в gcc як " -Wl,-rpath,.Альтернатива", ви можете вказати повторювані екземпляри -Wl:

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

Зауважте, що між aaaта другою комою немає -Wl.

Або у вашому випадку -Wl,-rpath -Wl,..


5
О, я розумію, що немає жодної дискримінації між варіантом чи аргументом під час передачі матеріалів до лінкера, це лише рядок. Тож друге -Wl є зайвим! Дякую :)
Blub

29
@Blub: Це не зайве! Це альтернативна форма, або ви говорите, -Wl,-rpath,. або ви говорите -Wl,-rpath -Wl,.. Точно одне з двох, ви нічого не можете опустити.
Керрек СБ

Хтось мав успіх у налаштуванні rpath на OS X, тобто з clang & ld64?
ben-albrecht

Як виглядатиме синтаксис, якби ви хотіли вказати кілька маршрутів? -Wl,-rpath -Wl,. -Wl,-rpath -Wl,/my/lib?
Хінтрон

1
@Hintron: Так, або -Wl,-rpath,dir1,-rpath,dir2або -Wl,-rpath=dir1,-rpath=dir2.
Керрек СБ

63

Ви також могли написати

-Wl,-rpath=.

Щоб позбутися цього нудного простору. Це, можливо, читабельніше, ніж додавання додаткових коми (це саме те, що передається ld).


3
З gcc.gnu.org/onlinedocs/gcc/Link-Options.html#Link-Options в розділі -Wl,option: " Використовуючи посилання GNU , ви також можете отримати той же ефект за допомогою -Wl, -Map = output.map." Мені це, здається, вказує на те, що якщо ви використовуєте інший лінкер, ніж лінкер GNU, =синтаксис може не підтримуватися.
Хінтрон

39

Ще одна річ. Ви , можливо , буде потрібно вказати опцію -L , а також - наприклад ,

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

або у вас може виникнути помилка на зразок

ld: cannot find -lbaz

10

Сторінка людини робить це досить зрозумілим. Якщо ви хочете передати два аргументи ( -rpathі .) на лінкер, ви можете написати

-Wl,-rpath,.

або альтернативно

-Wl,-rpath -Wl,.

Аргументи, які -Wl,-rpath .ви запропонували, НЕ мають сенсу для мене. Як gcc повинен знати, що ваш другий аргумент ( .) повинен бути переданий посилання, а не інтерпретуватися нормально? Єдиний спосіб, як це можна було б знати, це, якби він знав всередині всіх можливих аргументів лінкера, тож знав, що -rpathпісля цього потрібен аргумент.


немислимо, що gcc аналізує аргументи, і якщо щось не має сенсу, воно автоматично групується.
Blub
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.