где находится LD_LIBRARY_PATH? как установить переменную env LD_LIBRARY_PATH?

26

Я пытаюсь построить программу на C ++ с использованием Unix.

Я получил ошибку

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

Я слышал, что мне просто нужно установить местоположение libboost * в моей переменной env LD_LIBRARY_PATH, а затем вызвать make, как я это делал изначально, набрав

-L /usr/lib64 -l boost_regex-mt

или

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib64

Но где же LD_LIBRARY_PATH? как установить переменную env LD_LIBRARY_PATH?

CSX
источник
Почему вы отредактировали большую часть своего вопроса, когда он предоставлял некоторый полезный контекст для понимания вашей проблемы?
Jlliagre
@jlliagre Я согласен: без контекста, поставленного в исходном вопросе, ответ с наибольшим количеством голосов не имеет смысла. Я откатился назад.
John1024

Ответы:

25

как установить переменную env LD_LIBRARY_PATH?

Вы уже установили его, когда сделали это:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib64

Но это не решит вашу проблему. $LD_LIBRARY_PATHконсультируется во время выполнения, чтобы предоставить список дополнительных каталогов, в которых можно искать динамически подключаемые библиотеки. С ним не консультируются во время компоновки (за исключением, может быть, поиска библиотек, необходимых самим встроенным инструментам!).

Чтобы указать компоновщику, где искать библиотеки во время сборки, необходимо использовать параметр -Lкомпоновщика. Вы уже сделали это тоже:

-L /usr/lib64

Если вы по-прежнему получаете сообщение об ошибке, вам необходимо убедиться, что библиотека действительно есть. У вас есть файл libboost_regex-mt.soили libboost_regex-mt.aв этом (или любом) каталоге? Обратите внимание, что файл как libboost_regex-mt.so.othersuffixне считается для этой цели. Если у вас его нет, вам, вероятно, нужно установить пакет разработки вашего дистрибутива для этой библиотеки.

Celada
источник
Под Linux, согласно справочной странице ld (1), $LD_LIBRARY_PATHтакже обращаются к ld: «5. Для нативного компоновщика найдите содержимое переменной окружения" LD_LIBRARY_PATH ". »
vinc17
@csx - какой у тебя дистрибутив? Ubuntu, Fedora, CentOS и т. Д.? См. Здесь, например, для: stackoverflow.com/questions/15874220/…
slm
@ vinc17, эта цитата из ldman- страницы касается только рекурсивных зависимостей: зависимых библиотек библиотеки, которая уже была выбрана для связи. Это не касается поиска библиотек для исполняемого исполняемого файла. Вот что -Lделает.
Селада
@csx Я ничего не знаю о научном Linux, но если apt-getкоманда не найдена, значит, она не является производной от Debian, поэтому вам нужен другой метод для установки отсутствующего пакета. Это определенно то, что ваша проблема, хотя.
Селада
Поздно, но: -Ldir -llibдолжно работать как аргументы ldили gcc/g++/etcкогда включается фаза соединения, но упоминается оригинальный и восстановленный Q make: с нормальным make-файлом, который вам, вероятно, нужен, LDFLAGS="whatever"и с умным make-файлом, вам может понадобиться почти все, включая кирпичи, чтобы бросить умному автору make-файла.
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

iparjono
источник
4

Вы можете установить его в своем ~/.profileи / или определенном файле инициализации вашей оболочки (например, ~/.bashrcдля bash, ~/.zshenvдля zsh). Затем вам нужно перезапустить вашу оболочку (и, возможно, выйти из системы и войти снова, в зависимости от вашего выбора).

Вы можете проверить свои настройки с помощью:

env | grep '^LD_LIBRARY_PATH'

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

vinc17
источник
Моя скомпилированная программа все еще жалуется на отсутствие библиотеки Python, хотя я вижу правильный путь, используя env | grep '^ LD_LIBRARY_PATH'. В чем может быть проблема?
Герман Тутрот
@HermanToothrot Я обновил свой ответ. Обратите внимание, что Python имеет свою собственную систему библиотек. Я подозреваю, что он не использует LD_LIBRARY_PATH(чтобы избежать столкновений с обычными библиотеками). Для этого вам нужно задать конкретный вопрос с сообщением об ошибке, которое вы получите.
Vinc17
3

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

Gary
источник
это работало отлично! Мой файл conf указывает на этот каталог /etc/ld.so.conf.d, поэтому просто добавьте файл с вашим путем libs в эту папку. также обязательно запустите ldconfig от имени пользователя root (или sudo it)
RLaaa
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
Дейв
источник