Подтвердить что ты не робот

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 вызывается, как сообщение об ошибке предполагает?
  • Какой смысл с двумя переменными, обслуживающими одни и те же цель? Есть ли другие различия?
4b9b3361

Ответ 1

LIBRARY_PATH используется gcc перед компиляцией для поиска в каталогах, содержащих статические и общие библиотеки, которые необходимо связать с вашей программой.

LD_LIBRARY_PATH используется вашей программой для поиска каталогов, содержащих общие библиотеки, после того, как она была успешно скомпилирована и скомпонована.

РЕДАКТИРОВАТЬ: Как указано ниже, ваши библиотеки могут быть статическими или общими. Если он статический, то код копируется в вашу программу, и вам не нужно искать библиотеку после того, как ваша программа скомпилирована и скомпонована. Если ваша библиотека является общей, то она должна быть динамически связана с вашей программой, и это когда LD_LIBRARY_PATH вступает в игру.

Ответ 2

Поиск LD_LIBRARY_PATH выполняется при запуске программы, LIBRARY_PATH выполняется во время соединения.

будьте осторожны из комментариев:

Ответ 3

Так как я связываюсь с gcc, почему ld вызывается, как подсказывает сообщение об ошибке?

gcc вызывает ld внутренне, когда он находится в режиме привязки.