Я не понимаю -Wl, -rpath -Wl,
Для удобства я добавил соответствующие справочники ниже.
Сначала мое (неправильное) понимание: если мне нужно разделить параметры с ,
, это означает, что второй -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 = dir
Добавить каталог в путь поиска библиотеки времени выполнения. Это используется при связывании исполняемого файла ELF с общими объектами. Все -rpath аргументы конкатенируются и передаются к компоновщику времени выполнения, который использует их для нахождения общих объектов во время выполнения. Опция -rpath также используется, когда размещение общих объектов, которые необходимо для общих объектов явно включен в ссылку;
Ответы
Ответ 1
Опция -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
Или, в вашем случае, -Wl,-rpath -Wl,.
.
Ответ 2
Вы также можете написать
-Wl,-rpath=.
Чтобы избавиться от этого надоедливого пространства. Это, возможно, более читаемо, чем добавление дополнительных запятых (именно это передается в ld).
Ответ 3
Еще одна вещь. Возможно, вам также необходимо указать параметр -L - например,
-Wl,-rpath,/path/to/foo -L/path/to/foo -lbaz
или вы можете получить ошибку, например
ld: cannot find -lbaz
Ответ 4
Страница man делает это довольно ясным. Если вы хотите передать два аргумента (-rpath
и .
) в компоновщик, вы можете написать
-Wl,-rpath,.
или, альтернативно,
-Wl,-rpath -Wl,.
Аргументы -Wl,-rpath .
, которые вы предложили, НЕ имеют смысла. Как gcc должен знать, что ваш второй аргумент (.
) должен быть передан компоновщику вместо обычного интерпретации? Единственный способ узнать, что это, если бы он имел инсайдерское знание всех возможных аргументов компоновщика, чтобы он знал, что -rpath
потребовал после него аргумент.