Я не понимаю -Wl, -rpath -Wl,

245

Для удобства я добавил соответствующие страницы ниже.

Мой (MIS) понимание первое: Если мне нужно отделить варианты с ,, что означает , что второй -Wlне другой вариант , потому что речь идет , прежде чем ,это означает , что это аргумент -rpathопцию.

Я не понимаю, как -rpathможно -Wl,.поспорить!

Что бы иметь смысл в моем уме было бы так:

-Wl,-rpath .

Это должно вызвать опцию -rpath linker с текущим аргументом каталога.


man gcc:

-Wl, вариант

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

человек лд:

-rpath = каталог

Добавьте каталог в путь поиска библиотеки времени выполнения. Это используется при связывании исполняемого файла ELF с общими объектами. Все аргументы -rpath объединяются и передаются компоновщику среды выполнения, который использует их для поиска общих объектов во время выполнения. Опция -rpath также используется при поиске общих объектов, которые необходимы для общих объектов, явно включенных в ссылку;

Blub
источник
2
Разве в конце заголовка отсутствует символ точки?
Селдор

Ответы:

278

-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
О, теперь я понимаю, что нет никакой разницы между опцией или аргументом при передаче вещи компоновщику, это просто строка. Так что вторая -бесполезна! Спасибо :)
Blub
29
@Blub: это не избыточно! Это альтернативная форма, вы либо говорите, -Wl,-rpath,. либо говорите -Wl,-rpath -Wl,.. Точно один из двух, вы ничего не можете опустить.
Kerrek SB
У кого-нибудь был успех в установке rpath на OS X, т.е. с помощью clang & ld64?
Бен-Альбрехт
Как будет выглядеть синтаксис, если вы хотите указать несколько rpath? -Wl,-rpath -Wl,. -Wl,-rpath -Wl,/my/lib?
Хинтрон
1
@ Хинтрон: Да, или -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
Vince
источник
10

Справочная страница проясняет это. Если вы хотите передать два аргумента ( -rpathи .) компоновщику, вы можете написать

-Wl,-rpath,.

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

-Wl,-rpath -Wl,.

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

Дэвид Грейсон
источник
немыслимо, что gcc анализирует аргументы и, если что-то не имеет смысла, автоматически группирует.
Blub