- set library path for current script [closed]
- 2 Answers 2
- 🐧 Как использовать команду ldconfig в системах Linux
- Конфигурационный файл /etc/ld.so.conf
- Список кэшированных библиотек
- Добавление новых библиотек с помощью ldconfig
- Переменная LD_LIBRARY_PATH
- Команда ldd
- How do you specify the location of libraries to a binary? (linux)
- 3 Answers 3
set library path for current script [closed]
How can I set the library path for the current script that’s running? I mean I don’t want to list a new path for the libraries in a textfile. I tried it using export LD_LIBRARY_PATH=$(pwd)/lib/ This is the script:
#!/bin/bash LD_LIBRARY_PATH="$(pwd)/lib/" export LD_LIBRARY_PATH ./X3TC_config
The script you’ve posted does exactly what you’re asking. If that’s not working for you, tell us where the libraries are located, what the current directory is when you start the script, and copy-paste the error messages complaining of a missing library. I suspect that you’re asking the wrong question but I can’t tell what the right question would be with so little information.
2 Answers 2
In your script, these two lines close to the top should do the trick:
LD_LIBRARY_PATH="$(pwd)/lib" export LD_LIBRARY_PATH
Although bash allows you to set and export a variable in a single statement, not all shells do, so the two step approach is more portable, if that’s a concern.
If this isn’t working for you, check that you are running the script from the right place — using $(pwd) like this ties you to running the script from the directory that contains the required ./lib subdirectory.
If you want to be able to run the script from anywhere, you need to use the absolute path to the ./lib subdir, or construct a relative path from the directory portion of the path to the script using, e.g., $(dirname $0)
🐧 Как использовать команду ldconfig в системах Linux
Команда ldconfig используется для того, чтобы сообщить системе о новом расположении разделяемых библиотек.
При этом используется информация, предоставленная конфигурационным файлом /etc/ld.so.conf.
Команда ldconfig создает базу данных кэша всех библиотек на основе конфигурационного файла.
Этот кэш обычно хранится в файле /etc/ld.so.cache.
Вот синтаксис команды ldconfig:
В следующей таблице описаны полезные опции команды ldconfig:
ОПЦИЯ | ОПИСАНИЕ |
---|---|
-v | Вывести дополнительную информацию. |
-n | Использовать опцию командной строки для указания местоположения новых разделяемых библиотек. Пример: ldconfig -n /some/directory. |
-f | Указать другой файл конфигурации, а не файл по умолчанию (/etc/ld.so.conf). |
-p | Используется для вывода списка текущих библиотек, хранящихся в файле кэша. |
Конфигурационный файл /etc/ld.so.conf
Основным конфигурационным файлом для разделяемых библиотек является файл /etc/ld.so.conf; однако, как правило, в этом файле есть только одна строка:
# cat /etc/ld.so.conf include ld.so.conf.d/*.conf
Строка include в этом файле указывает системе также использовать все файлы конфигурации в указанном каталоге.
В случае предыдущего примера это будут все файлы, которые заканчиваются на “.conf” в каталоге /etc/ld.so.conf.d.
Сам конфигурационный файл прост.
Он просто содержит каталог, в котором хранятся разделяемые библиотеки:
# more /etc/ld.so.conf.d/libiscsi-x86_64.conf /usr/lib64/iscsi # ls /usr/lib64/iscsi libiscsi.so.2 libiscsi.so.2.0.10900
Список кэшированных библиотек
Чтобы перечислить кэшированные библиотеки, вы можете использовать опцию -p команды ldconfig, как показано ниже:
# ldconfig -p | more 784 libs found in cache `/etc/ld.so.cache' p11-kit-trust.so (libc6,x86-64) => /lib64/p11-kit-trust.so libz.so.1 (libc6,x86-64) => /lib64/libz.so.1 libyaml-0.so.2 (libc6,x86-64) => /lib64/libyaml-0.so.2 libyajl.so.2 (libc6,x86-64) => /lib64/libyajl.so.2 libxtables.so.10 (libc6,x86-64) => /lib64/libxtables.so.10 libxslt.so.1 (libc6,x86-64) => /lib64/libxslt.so.1 libxshmfence.so.1 (libc6,x86-64) => /lib64/libxshmfence.so.1 libxml2.so.2 (libc6,x86-64) => /lib64/libxml2.so.2 libxmlrpc_util.so.3 (libc6,x86-64) => /lib64/libxmlrpc_util.so.3 libxmlrpc_server_cgi.so.3 (libc6,x86-64) => /lib64/libxmlrpc_server_cgi.so.3 libxmlrpc_server_abyss.so.3 (libc6,x86-64) => /lib64/libxmlrpc_server_abyss.so.3 .
Добавление новых библиотек с помощью ldconfig
Чтобы добавить в систему новые шаренные библиотеки, сначала нужно загрузить библиотеки в систему и поместить их в каталог.
После добавления новых библиотек необходимо создать конфигурационный файл в каталоге /etc/ld.so.conf.d, а затем выполнить команду ldconfig.
Все эти задачи следует выполнять от имени пользователя root:
# ls /usr/lib64/test mylib.so.1 # cat /etc/ld.so.conf.d/libtest.conf /usr/lib64/test # ldconfig
Если команда ldconfig выполнена успешно, вывода не будет.
Переменная LD_LIBRARY_PATH
Обычные пользователи не могут успешно выполнить команду ldconfig; однако, если обычный пользователь хочет использовать пользовательскую общую библиотеку, то он может загрузить этот файл в свой домашний каталог и использовать переменную LD_LIBRARY_PATH для указания местоположения файлов пользовательской библиотеки, как показано ниже:
$ ls /home/testuser/lib mylib.so.1 $ LD_LIBRARY_PATH=/home/testuser/lib
При полезном выполнении последняя команда не должна давать никакого результата.
Чтобы сделать это изменение постоянным, поместите команду LD_LIBRARY_PATH=/home/testuser/lib в файл ~/.bashrc.
$ vi ~/.bashrc LD_LIBRARY_PATH=/home/testuser/lib export LD_LIBRARY_PATH
Команда ldd
С помощью команды ldd можно посмотреть, какие общие библиотеки использует определенная команда.
Вот синтаксис команды ldd:
# ldd /bin/ls linux-vdso.so.1 => (0x00007ffee2b3f000) libselinux.so.1 => /lib64/libselinux.so.1 (0x00007ff5a6c22000) libcap.so.2 => /lib64/libcap.so.2 (0x00007ff5a6a1d000) libacl.so.1 => /lib64/libacl.so.1 (0x00007ff5a6814000) libc.so.6 => /lib64/libc.so.6 (0x00007ff5a6447000) libpcre.so.1 => /lib64/libpcre.so.1 (0x00007ff5a61e5000) libdl.so.2 => /lib64/libdl.so.2 (0x00007ff5a5fe1000) /lib64/ld-linux-x86-64.so.2 (0x00007ff5a6e49000) libattr.so.1 => /lib64/libattr.so.1 (0x00007ff5a5ddc000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007ff5a5bc0000)
Цель использования команды ldd – устранение проблем с кодом, который вы пишете.
Эта команда сообщает вам не только о том, какие библиотеки вызываются, но и о том, из какого каталога вызывается каждая библиотека.
Это может быть очень полезно, если библиотека ведет себя не так, как вы ожидаете.
В следующей таблице описаны полезные опции для команды ldd:
Опция | ОПИСАНИЕ |
---|---|
-v | Вывести дополнительную информацию. |
-u | Отображение всех неиспользуемых прямых зависимостей. |
How do you specify the location of libraries to a binary? (linux)
For this question I’ll be using a specific example, but really this generalizes to pretty much any binary on linux that can’t seem to find its’ dependent libraries. So, I have a program that won’t run because of missing libraries:
./cart5: error while loading shared libraries: libcorona-1.0.2.so: cannot open shared object file: No such file or directory
linux-vdso.so.1 => (0x00007fff18b01000) libcorona-1.0.2.so => not found libstdc++.so.6 => /usr/lib/gcc/x86_64-pc-linux-gnu/4.4.3/libstdc++.so.6 (0x00007f0975830000) libm.so.6 => /lib/libm.so.6 (0x00007f09755af000) libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007f0975399000) libc.so.6 => /lib/libc.so.6 (0x00007f0975040000) libz.so.1 => /lib/libz.so.1 (0x00007f0974e2b000) /lib64/ld-linux-x86-64.so.2 (0x00007f0975b36000)
oliver@human$ find / -name libcorona-1.0.2.so 2> /dev/null /usr/local/lib64/libcorona-1.0.2.so /home/oliver/installed/corona-1.0.2/src/.libs/libcorona-1.0.2.so
3 Answers 3
For a once-off, set the variable LD_LIBRARY_PATH to a colon-separated list of directories to search. This is analogous to PATH for executables, except that the standard system directories are additionally searched after the ones specified through the environment.
LD_LIBRARY_PATH=/usr/local/lib64 ./cart5
If you have a program that keeps libraries in a non-standard location and isn’t able to find them on its own, you can write a wrapper script:
#!/bin/sh if [ -n "$LD_LIBRARY_PATH" ]; then LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib64 else LD_LIBRARY_PATH=/usr/local/lib64 fi export LD_LIBRARY_PATH exec /path/to/cart5 "$@"
The list of standard system directories is kept in /etc/ld.so.conf . Recent systems allow this file to include other files; if yours contains something like include /etc/ld.so.conf.d/*.conf , create a new file called /etc/ld.so.conf.d/mala.conf containing the directories you want to add. After you change /etc/ld.so.conf or an included file, run /sbin/ldconfig for your changes to take effect (this updates a cache).
( LD_LIBRARY_PATH also applies to many other unices, including FreeBSD, NetBSD, OpenBSD, Solaris and Tru64. HP-UX has SHLIB_PATH and Mac OS X has DYLD_LIBRARY_PATH . /etc/ld.so.conf has analogs on most unices but the location and syntax differs more widely.)