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

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

210 голосов
/ 03 июля 2011

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

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

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

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

-Wl,-rpath .

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


man gcc:

-Wl, опция

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

man ld:

-rpath = dir

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

Ответы [ 4 ]

243 голосов
/ 03 июля 2011

Опция -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,..

60 голосов
/ 27 марта 2013

Вы также можете написать

-Wl,-rpath=.

Чтобы избавиться от этого надоедливого пространства.Возможно, это более читабельно, чем добавление дополнительных запятых (это именно то, что передается в ld).

36 голосов
/ 08 марта 2012

Еще одна вещь. Возможно, вам также потребуется указать параметр -L - например,

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

или вы можете получить ошибку типа

ld: cannot find -lbaz
8 голосов
/ 03 июля 2011

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

-Wl,-rpath,.

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

-Wl,-rpath -Wl,.

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

...