Я не понимаю -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 потребовал после него аргумент.