Имеет ли значение порядок параметров -l и -L в компоновщике GNU?

Опция -l указывает компоновщику искать библиотеки в стандартных каталогах. А с помощью -L мы можем указать наши собственные библиотечные каталоги для поиска.

Вопрос: Имеет ли значение последовательность для опции -L, как и для -l относительно компоновщика?

Эта ссылка: http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html ничего не говорит о последовательности -L.

ИЗМЕНИТЬ Кроме того,

Каталоги, указанные в командной строке, ищутся перед каталогами по умолчанию.

находится на странице руководства (как указал Дмитрий), означает ли это, что даже если я укажу порядок, например:

gcc -lm hello.c -Lx

по-прежнему предпочтение будет отдаваться каталогу, указанному с помощью -L?


person Aquarius_Girl    schedule 28.04.2011    source источник
comment
still the library specified with -L... : -L не указывает библиотеку (он указывает каталоги поиска)   -  person sehe    schedule 28.04.2011
comment
@sehe спасибо, это была опечатка (теперь я отредактировал), я еще не получил ответа на свой второй вопрос.   -  person Aquarius_Girl    schedule 28.04.2011
comment
возможный дубликат Почему порядок '-l' вариант в gcc имеет значение?   -  person pattivacek    schedule 05.03.2014


Ответы (1)


Да, порядок -L опций имеет значение, как и -l и -I опций.

От man ld

-Lsearchdir
--library-path=searchdir

Добавьте path searchdir в список путей, по которым ld будет искать архивные библиотеки и сценарии управления ld. Вы можете использовать эту опцию любое количество раз. Каталоги просматриваются в том порядке, в котором они указаны в командной строке. Каталоги, указанные в командной строке, ищутся перед каталогами по умолчанию. Все параметры -L применяются ко всем параметрам -l независимо от порядка их появления.

документация GCC и, в частности, Параметры связывания будут вам полезны

Редактировать
Извините, я действительно пропустил проверку указанной вами ссылки. "man ld" можно просто написать в консоли.

Edit2
Я сделал простой тест, поставив -l перед -L параметрами, и он не показал никакой разницы по сравнению с -L до -l

Итак, отвечая на ваш второй вопрос, это

gcc -lm hello.c -Lx

равно этому

gcc -Lx -lm hello.c

libm сначала ищется в каталоге x/ в обоих тестах.

Однако обратите внимание, что размещение -l<lib> перед исходными файлами является плохой практикой, поскольку это может привести к неопределенным ссылкам при связывании. Это правильный путь

gcc hello.c -Lx -lm 
person Dmitry Yudakov    schedule 28.04.2011
comment
Спасибо, это должно быть где-то задокументировано, я не могу найти, если есть ссылка, подтверждающая это, буду благодарен. - person Aquarius_Girl; 28.04.2011
comment
Благодарен вам :hattip: Я провел поиск в Google, прежде чем задать вопрос здесь, с ключевыми словами «man ld», и вторая ссылка, которую я получил, была: linux.die.net/man/8/ld-linux, я предпочитаю die.net справочным страницам, но на этот раз я ошибся -linux» вместо «ld». Спасибо, что указали. - person Aquarius_Girl; 28.04.2011
comment
Вы не перешли по ссылке, которую я дал в первом посте? Ваша вторая ссылка такая же. И я слежу за официальной онлайн-документацией GNU. Спасибо за беспокойство :) - person Aquarius_Girl; 28.04.2011
comment
@Dmitry, пожалуйста, посмотрите редактирование в моем первом посте и посмотрите, можете ли вы его прокомментировать? - person Aquarius_Girl; 28.04.2011
comment
@Dmitry большое спасибо, это означает, что используемые указанные местоположения ищутся в первую очередь по сравнению со стандартными каталогами, независимо от порядка размещения. - person Aquarius_Girl; 29.04.2011
comment
Таким образом, -L указывает каталог библиотеки, а -l указывает используемую библиотеку. В этом случае файл libm.a должен находиться в каталоге ./x ? - person qed; 07.02.2014
comment
@qed Да, файл библиотеки (.a или .so) должен находиться в каталоге x/ в соответствии с приведенными примерами. Обратите внимание, что libm.a — это просто случайное имя библиотеки в этом примере, не путайте с системной математической библиотекой libm.so/.a. - person Dmitry Yudakov; 11.02.2014