Я создаю простую программу на 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, как следует из сообщения об ошибке?
- Какой смысл иметь две переменные, служащие одной цели? Есть ли другие отличия?
LIBRARY_PATH
используется для поиска каталогов, содержащих статические и динамические библиотеки, а не только статические библиотеки.LIBRARY_PATH
ищется для библиотек (статические или динамические) при компиляции иLD_LIBRARY_PATH
ищется динамических библиотек во время выполнения. Конечно, во время выполнения вам не нужно искать статические библиотеки.LD_LIBRARY_PATH
ищется при запуске программы,LIBRARY_PATH
ищется во время ссылки.будьте осторожны из комментариев :
ld
(вместоgcc
илиg++
) переменные средыLIBRARY_PATH
илиLD_LIBRARY_PATH
не читаются.gcc
илиg++
,LIBRARY_PATH
переменная среды читается (см. Документацию «gcc
использует эти каталоги при поиске обычных библиотек» ).источник
ld
сами по себе не ищет библиотеки либоLIBRARY_PATH
илиLD_LIBRARY_PATH
. Это только когдаgcc
вызывает,ld
чтоLIBRARY_PATH
используется. (Изучил это трудным путем.)gcc вызывает ld внутри, когда он находится в режиме связывания.
источник