Почему -L требуется, когда используется -rpath?

Я обнаружил, что при использовании -rpath должен быть задан флаг -L. Например:

gcc -o test test.o -L. -lmylib -Wl,-rpath=.

Почему нужен флаг -L? Какая информация больше, чем информация из h файлов необходима во время компиляции?

Если я удалю -L. Я получаю следующее сообщение:

gcc -o test test.o -lmylib -Wl,-rpath=.
/usr/bin/ld: cannot find -lmyLib
Тем не менее, вполне нормально удалять оба флага. Вот так:
gcc -o test test.o -lmylib

Если libmyLib можно найти в /usr/lib, то есть. Почему нет -L нужно сейчас?

Это следующий вопрос: qaru.site/info/92709/....

Ответ 1

Даже динамические библиотеки требовали определенной статической связи; компоновщик должен знать, какие символы должны быть предоставлены динамической библиотекой. Основное различие заключается в том, что динамическая библиотека предоставляет определение во время выполнения, в то время как полностью статическая библиотека предоставляет определение во время связи.

По этой причине -L необходимо указать, где находится файл для ссылки, так же, как -L указывает конкретную библиотеку. . указывает текущий каталог.

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

Причина -L/usr/lib не требуется указывать, потому что компоновщик ищет по умолчанию (поскольку это очень распространенное место для размещения библиотек).

Ответ 2

Прояснение ответа OMGtechy.

Если компоновщик не проверяет, какие символы предоставляются библиотекой, он никогда не сможет сказать, отсутствуют ли какие-либо символы во время компиляции. Они могут находиться в одной из библиотек, загруженных во время выполнения. Вы никогда не узнаете. Во время компиляции между файлами заголовков библиотеки и файлом .so нет связи.