LD_LIBRARY_PATH против LIBRARY_PATH - PullRequest
140 голосов
/ 23 ноября 2010

Я создаю простую программу на C ++ и хочу временно заменить предоставленную системой разделяемую библиотеку более поздней версией для разработки и тестирования.

Я попытался установить переменную LD_LIBRARY_PATH, но компоновщик (ld) завершился неудачно:

/ usr / bin / ld: не удается найти -lyaml-cpp

Я ожидал, что это сработает, потому что согласно man-странице ld:

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

Затем я попытался установить LIBRARY_PATH, и это сработало.

Согласно руководству GCC:

Значение LIBRARY_PATH - список, разделенный двоеточиями каталогов, так же, как PATH. когда настроен как собственный компилятор, GCC пытается каталоги, указанные таким образом при поиске специального линкера файлы, если он не может найти их, используя GCC_EXEC_PREFIX. Связывание с помощью GCC также использует эти каталоги, когда поиск обычных библиотек для опция -l (но каталоги указывается с -L на первом месте).

Как предполагает руководство (GCC), LIBRARY_PATH работает, потому что я связываюсь с GCC.

Но ..

  • Поскольку я связываюсь с gcc, почему ld вызывается, как сообщение об ошибке предполагает?
  • Какой смысл имея две переменные, служащие одинаково цель? Есть ли другие различия?

Ответы [ 3 ]

191 голосов
/ 23 ноября 2010

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

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

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

42 голосов
/ 27 ноября 2010

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

предостережение от комментариев :

11 голосов
/ 02 декабря 2011

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

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

...