Что такое LD_LIBRARY_PATH и как им пользоваться?

Я участвую в разработке Java-проекта, в котором используются некоторые компоненты C ++, поэтому мне нужно Jacob.dll. (в Windows 7)

Я продолжаю получать java.lang.UnsatisfiedLinkError: no JacobDB in java.library.path, куда бы я ни положил Jacob.dll ....

Я искал возможные решения, и то, что я до сих пор не пробовал, - это установка переменной LD_LIBRARY_PATH, указывающей на файл .dll.

У меня мало опыта, и я не знаю, каким должно быть значение и использование этой переменной - вы можете мне помочь?


person karla    schedule 22.08.2011    source источник
comment
google: java.library.path ... щелкните любую ссылку, в которой говорится об этом и dll ...   -  person Nim    schedule 22.08.2011
comment
и вот тот, что я сделал ранее: inonit.com/cygwin/jni/helloWorld/load .html   -  person Nim    schedule 22.08.2011
comment
Если вы используете Windows и вам нужно загрузить эту dll, используйте системную переменную PATH или поместите dll в каталог Windows / System32. LD_LIBRARY_PATH не используется в Windows.   -  person Paul Gregoire    schedule 27.08.2014


Ответы (6)


Обычно вы должны установить java.library.path в командной строке JVM:

java -Djava.library.path=/path/to/my/dll -cp /my/classpath/goes/here MainClass
person hmakholm left over Monica    schedule 22.08.2011
comment
ммм ... но ... что такое LD_LIBRARY_PATH? - person JPCF; 19.02.2017
comment
См. stackoverflow.com/questions/27945268/ - person Plaiska; 20.02.2020

LD_LIBRARY_PATH - это предопределенная переменная среды в Linux / Unix, которая устанавливает путь, по которому компоновщик должен искать при компоновке динамических библиотек / разделяемых библиотек.

LD_LIBRARY_PATH содержит список путей, разделенных двоеточиями, и компоновщик отдает приоритет этим путям над путями стандартной библиотеки /lib и /usr/lib. Поиск по стандартным путям будет продолжаться, но только после того, как будет исчерпан список путей в LD_LIBRARY_PATH.

Лучший способ использовать LD_LIBRARY_PATH - установить его в командной строке или сценарии непосредственно перед выполнением программы. Таким образом новый LD_LIBRARY_PATH изолирован от остальной части вашей системы.

Пример использования:

$ export LD_LIBRARY_PATH="/list/of/library/paths:/another/path"
$ ./program

Поскольку вы говорите о .dll, вы находитесь в системе Windows, и .dll должен быть помещен в путь, который компоновщик ищет во время ссылки, в Windows этот путь устанавливается переменной среды PATH, поэтому добавьте это .dll в PATH, и он должен работать отлично.

person Alok Save    schedule 22.08.2011
comment
У меня проблема, пожалуйста, помогите и мне https://superuser.com/questions/1396481/java-application-not-picking-up-app-properties-on-widows-10 - person Arash; 21.01.2019

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

Попробуйте добавить каталог, в котором находится ваша .dll, в переменную PATH. Windows автоматически просматривает каталоги, перечисленные в этой переменной среды. LD_LIBRARY_PATH, вероятно, не решит проблему (если JVM не использует это - я не знаю об этом).

person Markus Pilman    schedule 22.08.2011
comment
Спасибо, очевидно, у меня это не сработает. В противном случае добавление элемента в переменную PATH было тем, что я сделал в первую очередь ... пока безуспешно :) - person karla; 22.08.2011
comment
Я не разработчик Java, но не могли бы вы попробовать распечатать переменную java.library.path (с помощью System.getProperty ())? Вы также можете попытаться установить эту переменную с помощью флага командной строки -D при запуске виртуальной машины - возможно, даже установка этого параметра во время выполнения может сработать. Если вы работаете в Eclipse imho, есть способ установить что-то вроде местоположения собственной библиотеки в настройке Путь сборки в свойствах проекта. - person Markus Pilman; 22.08.2011
comment
Не Linux !! Все Unix-системы используют эту переменную среды! И не для ссылки, а для загрузки! Статически связанные библиотеки обычно передаются компоновщику в командной строке, динамически загружаемые библиотеки ищутся через LD_LIBRARY_PATH. См., Например, linuxmafia.com/faq/Admin/ld-lib-path.html - person Angel O'Sphere; 22.08.2011
comment
@Angel O'Sphere: 1-й: динамический компоновщик будет использовать это для загрузки. 2-й: Mac OS X использует DYLD_LIBRARY_PATH. Разумеется: LD_LIBRARY_PATH не относится к Linux, но я думаю, что в контексте вопроса это мелочь. Ах да, кстати: я писал о загрузке - так где в моем комментарии вы видите что-нибудь о ссылках и LD_LIBRARY_PATH? - person Markus Pilman; 22.08.2011
comment
У меня проблема, пожалуйста, помогите мне https://superuser.com/questions/1396481/java-application-not-picking-up-app-properties-on-widows-10 - person Arash; 21.01.2019

LD_LIBRARY_PATH - это путь к библиотеке по умолчанию, который используется для проверки доступных динамических и общих библиотек. Это характерно для дистрибутивов Linux.

Это похоже на переменную среды PATH в Windows, которая проверяет возможность реализации во время компоновки.

person Shrikanth N    schedule 04.07.2018

Что ж, сообщение об ошибке сообщает вам, что делать: добавьте путь, по которому находится Jacob.dll, в java.library.path. Вы можете сделать это в командной строке следующим образом:

java -Djava.library.path="dlls" ...

(при условии, что Jacob.dll находится в папке "dlls")

Также см. java.lang.UnsatisfiedLinkError no *****. dll в java.library.path

person daniel kullmann    schedule 22.08.2011
comment
После запуска JVM вы не можете установить java.library.path таким образом. - person Lorand Bendig; 09.03.2013

Моя ошибка также была связана с тем, что служба не нашла требуемый .so файл. Я использовал переменную LD_LIBRARY_PATH для определения приоритета пути, выбранного компоновщиком для поиска требуемой библиотеки.

Я скопировал и сервис, и файл .so в папку и скормил его переменной LD_LIBRARY_PATH как

LD_LIBRARY_PATH=. ./service

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

person anurag singh    schedule 04.07.2018