де LD_LIBRARY_PATH? як встановити змінну LV_LIBRARY_PATH env?


26

Я намагаюся створити програму c ++ за допомогою Unix.

Я отримав помилку

Linking CXX executable ../../bin/ME
/usr/bin/ld: cannot find -lboost_regex-mt

Я почув, що мені просто потрібно встановити розташування libboost * в моїй змінній LD_LIBRARY_PATH env, а потім викликати make так, як я це робив спочатку, ввівши

-L /usr/lib64 -l boost_regex-mt

або

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib64

Але де LD_LIBRARY_PATH? як встановити змінну LV_LIBRARY_PATH env?


Чому ви відредагували більшість запитань, коли він надав корисний контекст для розуміння вашої проблеми?
jlliagre

@jlliagre Я погоджуюсь: без контексту, що надається оригінальним запитанням, відповідь, що відповідає головою, не має сенсу. Я відкотив її назад.
John1024

Відповіді:


25

як встановити змінну LV_LIBRARY_PATH env?

Ви вже встановили це, коли це зробили:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib64

Але це не вирішить вашу проблему. $LD_LIBRARY_PATHпроводиться консультація під час виконання, щоб забезпечити перелік додаткових каталогів, в яких можна шукати динамічно пов'язані бібліотеки. Це не проводиться консультація під час зв’язку (за винятком, можливо, для пошуку бібліотек, необхідних самими вбудованими інструментами!).

Для того, щоб сказати лінкеру, де знайти бібліотеки під час збирання, потрібно скористатися параметром -Llinker. Ви вже це зробили:

-L /usr/lib64

Якщо ви все ще отримуєте помилку, то вам потрібно переконатися, що бібліотека є насправді. У вас є файл libboost_regex-mt.soабо libboost_regex-mt.aв тому (або будь-якому) каталозі? Зауважте, що такий файл, як libboost_regex-mt.so.othersuffixі для цього, не враховується. Якщо у вас цього немає, вам, ймовірно, потрібно встановити пакет розробки вашого дистрибутива для цієї бібліотеки.


Під Linux, згідно зі сторінкою ld (1) man, $LD_LIBRARY_PATHтакож звертаються до ld: «5. Для вбудованого посилання шукайте вміст змінної середовища" LD_LIBRARY_PATH ". »
vinc17

@csx - який у вас дистрибутив? Ubuntu, Fedora, CentOS тощо? Дивіться тут, наприклад: stackoverflow.com/questions/15874220/…
slm

@ vinc17, ця цитата із сторінки сторінки ldстосується лише рекурсивних залежностей: залежні бібліотеки бібліотеки, які вже вибрані для підключення. Це не стосується пошуку бібліотек для створеного виконуваного файлу. Ось що і -Lробить.
Целада

@csx Я нічого не знаю про науковий Linux, але якщо apt-getкоманда не знайдена, то це не отримано Debian, тож вам потрібен інший метод для встановлення відсутнього пакету. Це, безумовно, у чому полягає ваша проблема.
Целада

Пізно, але: -Ldir -llibповинно працювати як аргументи до ldабо gcc/g++/etcпри включенні фази посилання, але згадується оригінальний та відновлений Q make: з нормальним makefile вам, мабуть, потрібен LDFLAGS="whatever"і з розумним makefile, можливо, вам знадобиться майже все, включаючи цегли, які потрібно кинути на розумного автора makefile.
dave_thompson_085

11

Ще один спосіб назавжди додати новий шлях у LD_LIBRARY_PATH:

Редагувати .confфайл у /etc/ld.so.conf.d/.

Я коли-небудь встановлював додаток, і його бібліотеки не вдалося розпізнати іншим додатком. Потім я додаю шлях, тобто /usr/local/hdf5/libдо x86_64-linux-gnu.confфайлу. Просто поставте в наступний рядок. Зберегти.

Потім бігайте sudo ldconfig

Це спрацювало.

PS: ОС Ubuntu 14.04


4

Ви можете встановити його у вашому ~/.profileта / або конкретному файлі init своєї оболонки (наприклад, ~/.bashrcдля bash, ~/.zshenvдля zsh). Потім вам потрібно перезапустити оболонку (і, можливо, вийти з системи та увійти знову, залежно від вашого вибору).

Ви можете перевірити свої настройки за допомогою:

env | grep '^LD_LIBRARY_PATH'

EDIT: LD_LIBRARY_PATHпризначений для спільних бібліотек, що містять машинний код, імена файлів яких зазвичай містять .soсвоє ім'я, можливо, за цим числом слід розділити періоди, щоб розрізнити різні версії. Можливо, що незважаючи на те LD_LIBRARY_PATH, що бібліотеку не знайдено через невідповідність ABI. Зауважте також, що мови (наприклад, Perl і Python) та пакети можуть мати власну систему бібліотек (можливо, також з .soфайлами), не пов'язану з LD_LIBRARY_PATH.


Моя складена програма все ще скаржиться на те, що не знайшла бібліотеку пітона, хоча я бачу правильний шлях за допомогою env | grep '^ LD_LIBRARY_PATH'. Що може бути проблемою?
Герман Зубник

@HermanToothrot Я оновив свою відповідь. Зауважте, що python має власну систему бібліотек. Я підозрюю, що він не використовується LD_LIBRARY_PATH(щоб уникнути зіткнень зі звичайними бібліотеками). Для цього вам потрібно задати конкретне запитання із отриманим повідомленням про помилку.
vinc17

3

Якщо помилка шляху вашої бібліотеки знаходиться в лінкері, під час компіляції вам потрібно додати шлях до бібліотеки до змінної $ LD_LIBRARY_PATH. Якщо помилка бібліотеки полягає в тому, що ви фактично запускаєте скомпільовану програму, вам потрібно додати шлях бібліотеки до /etc/ld.so.conf та запустити ldconfig, щоб відновити кеш шляху пошуку бібліотеки.


це чудово працювало! Мій файл конф вказує на цей каталог /etc/ld.so.conf.d, тому просто додайте файл із вашим контуром до цієї папки. також переконайтеся, що запустити ldconfig як root (або
судо

0

Вирішено:

додати в /etc/systemd/system/pm2-node.service

Environment=PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/app/nodejs/local/nvm/versions/node/v7.8.0/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Environment=PM2_HOME=/home/node/.pm2
Environment=LD_LIBRARY_PATH=/opt/oracle/instantclient_12_2
Environment=OCI_LIB_DIR=/opt/oracle/instantclient_12_2
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.