LD_LIBRARY_PATH против LIBRARY_PATH
Я создаю простую программу на С++, и я хочу временно заменить предоставленную системой общую библиотеку более новой версией для разработки и тестирования.
Я попытался установить переменную LD_LIBRARY_PATH, но с помощью компоновщика (ld) не было:
/usr/bin/ld: не удается найти -lyaml-cpp
Я ожидал, что работаю, потому что в соответствии со страницей ld man:
Компонент использует следующий поиск пути для поиска необходимых общих библиотеки:... Для родного компоновщика, содержимое переменной окружения "LD_LIBRARY_PATH"...
Затем я попытался установить LIBRARY_PATH, и это сработало.
В соответствии с руководством GCC:
Значение LIBRARY_PATH - это список, разделенный двоеточиями каталогов, как PATH. когда настроен как собственный компилятор, GCC пытается указать указанные каталоги при поиске специального линкера файлы, если они не могут найти их, используя GCC_EXEC_PREFIX. Связывание с использованием GCC также использует эти каталоги, когда поиск обычных библиотек для параметр -l (но каталоги указанный при первом -L).
Как следует из руководства (GCC), LIBRARY_PATH работает, потому что я связываюсь с GCC.
Но..
- Поскольку я связываюсь с gcc, почему ld
вызывается, как сообщение об ошибке
предполагает?
- Какой смысл
с двумя переменными, обслуживающими одни и те же
цель? Есть ли другие
различия?
Ответы
Ответ 1
LIBRARY_PATH
используется gcc перед компиляцией для поиска в каталогах, содержащих статические и общие библиотеки, которые необходимо связать с вашей программой.
LD_LIBRARY_PATH
используется вашей программой для поиска каталогов, содержащих общие библиотеки, после того, как она была успешно скомпилирована и скомпонована.
РЕДАКТИРОВАТЬ: Как указано ниже, ваши библиотеки могут быть статическими или общими. Если он статический, то код копируется в вашу программу, и вам не нужно искать библиотеку после того, как ваша программа скомпилирована и скомпонована. Если ваша библиотека является общей, то она должна быть динамически связана с вашей программой, и это когда LD_LIBRARY_PATH
вступает в игру.
Ответ 2
Поиск LD_LIBRARY_PATH
выполняется при запуске программы, LIBRARY_PATH
выполняется во время соединения.
будьте осторожны из комментариев:
Ответ 3
Так как я связываюсь с gcc, почему ld вызывается, как подсказывает сообщение об ошибке?
gcc вызывает ld внутренне, когда он находится в режиме привязки.