LD_LIBRARY_PATH проти LIBRARY_PATH


159

Я будую просту програму C ++ і хочу тимчасово замінити загальнодоступну бібліотеку, що постачається системою, більш новою її версією для розробки та тестування.

Я спробував встановити змінну 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, як підказує повідомлення про помилку?
  • Який сенс у тому, щоб дві змінні слугували одній цілі? Чи є інші відмінності?

Відповіді:


213

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

LD_LIBRARY_PATHВаша програма використовується для пошуку в каталогах, що містять спільні бібліотеки, після її успішного складання та зв’язування.

EDIT: Як зазначено нижче, ваші бібліотеки можуть бути статичними або спільними. Якщо він статичний, то код копіюється у вашу програму, і вам не потрібно шукати бібліотеку після того, як ваша програма буде складена і пов’язана. Якщо ваша бібліотека є спільною, її потрібно динамічно пов’язати з вашою програмою, і це вже LD_LIBRARY_PATHпочинає гратись.


14
І звичайно, LD_LIBRARY_PATH має сенс лише з динамічними бібліотеками
Алекс Жасмін

2
Моя думка полягає в тому, що якби я використовував ld для посилання (безпосередньо), то, згідно з посібником ld, LD_LIBRARY_PATH був би використаний для пошуку каталогів, що містять бібліотеки, які потрібно підключити до моєї програми. Я, мабуть, чогось тут пропускаю ..
Георгіос Політ

2
якщо ви не викликаєте ld самостійно та комбінуєте файли об'єктів з бібліотеками, він буде «успадковувати» шлях, який gcc проходить до нього. Ви можете змінити стандартний gcc, використовуючи параметри -Xlinker.
Naveen

5
Насправді LIBRARY_PATH використовується для пошуку каталогів, що містять статичні І динамічні бібліотеки, а не лише статичні бібліотеки.
частинка128

3
Так, це неправильно - різниця полягає в тому, що LIBRARY_PATHпід час компіляції шукають бібліотеки (статичні або динамічні) і LD_LIBRARY_PATHшукають динамічні бібліотеки під час виконання. Звичайно, під час запуску вам не потрібно шукати статичні бібліотеки.
Timmmm

47

LD_LIBRARY_PATHшукається при запуску програми, LIBRARY_PATHшукається в час посилання.

застереження з коментарів :


38
Примітка: при компонуванні бібліотек, ldсамі по собі не шукає бібліотеки або LIBRARY_PATHабо LD_LIBRARY_PATH. Це тільки коли gccвикликається, ldщо LIBRARY_PATHстає вживаним. (Навчився цьому важким шляхом.)
Rufflewind

1
@Rufflewind Цікаво, але було б навіть більше, якби ви дали будь-яку посилання.
hmijail сумує у відставці

Цей погляд робить різницю в моменті пошуку бібліотек (час зв'язку по відношенню до часу запуску), а @Naveen розрізняє тип шуканих бібліотек (статичний v динамічний). Чи є два перегляди ефективно однакові (динамічний: час запуску = статичний: час зв’язку) чи є важливі ситуації, коли це листування не виконується? Я б здогадався, що певні знання про динамічні бібліотеки потрібні і під час компіляції.
XavierStuvw

13

Оскільки я зв’язуюсь з gcc, чому викликається ld, як підказує повідомлення про помилку?

gcc викликає ld внутрішньо, коли він перебуває у режимі зв'язку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.