2011-07-03 8 views
154

Для удобства я добавил соответствующие справочники ниже.Я не понимаю -Wl, -rpath -Wl,

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

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

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

-Wl,-rpath . 

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


человек GCC:

-Wl, вариант

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

человек л.д.:

-rpath = каталог

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

ответ

182

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

gcc -Wl,aaa,bbb,ccc 

в конечном счете становится линкер, вызов,

ld aaa bbb ccc 

В вашем случае, вы хотите сказать, «ld -rpath .», так что вы передать это НКУ, как -Wl,-rpath,. Кроме того, вы можете указать повторяющиеся экземпляры -Wl:

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

Обратите внимание, что нет запятой между aaa и вторым -Wl.

Или, в вашем случае, -Wl,-rpath -Wl,..

+4

О, я понимаю, что нет никакой дискриминации между опцией или аргументом при передаче материала компоновщику, это просто строка. Итак, вторая -Wl избыточна! Спасибо :) – Blub

+21

@Blub: Это не избыточно! Это альтернативная форма, вы * или * говорите '-Wl, -rpath, .' * или * вы говорите' -Wl, -rpath -Wl, .'. Точно одно из двух, вы ничего не можете опустить. –

7

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

-Wl,-rpath,. 

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

-Wl,-rpath -Wl,. 

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

+0

немыслимо, что gcc анализирует аргументы, и если что-то не имеет смысла, оно автоматически группируется. – Blub

+10

На самом деле, это –

29

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

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

или вы можете закончить с ошибкой как

ld: cannot find -lbaz 
50

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

-Wl,-rpath=. 

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

+0

. Страницы руководства Debian и Fedora определяют его таким образом. – jww