BrokenBrake 04.08.2010 20:58
Tips & tricks — Узнать версию или наличие требуемой библиотеки
Часто встречается ситуация, когда приложение требует какую-то определённую версию библиотеки.Узнать, какая версия есть в системе можно с помощью простенькой функции (у меня она в .zshrc):
1 |
|
Пример использования(из жизни, только что):
~ me > agave
agave: error while loading shared libraries: libatkmm-1.6.so.1: cannot open shared object file: No such file or directory
~ me > lib libat
libatk-1.0.la
libatk-1.0.so
libatk-1.0.so.0
libatk-1.0.so.0.3009.1
libattr.a
libattr.so
agave: error while loading shared libraries: libatkmm-1.6.so.1: cannot open shared object file: No such file or directory
~ me > lib libat
libatk-1.0.la
libatk-1.0.so
libatk-1.0.so.0
libatk-1.0.so.0.3009.1
libattr.a
libattr.so
Ага, значит обновить надо пакетик.
Думаю, эта функция должна работать с любым дистрибутивом Linux.
P.S. По мотивам проверки пакета в SlackWare.
Shtsh 04.08.2010 21:10 #
+ 1 -
а нафига?
Название файла библиотеки часто может совершенно не совпадать с названием пакета. Так в любом дистрибутиве скорей всего.
В тему:
Ещё может помочь утилита ldd
Так:
Или так:
Ещё может помочь утилита ldd
ldd - print shared library dependencies
Так:
main@dell:~$ ldd /bin/bash
linux-gate.so.1 => (0x00e0b000)
libncurses.so.5 => /lib/libncurses.so.5 (0x00a23000)
libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0x002f0000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x005cb000)
/lib/ld-linux.so.2 (0x00e5e000)
Или так:
main@dell:~$ ldd -v /bin/bash
linux-gate.so.1 => (0x00397000)
libncurses.so.5 => /lib/libncurses.so.5 (0x0098e000)
libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0x0018a000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00e0f000)
/lib/ld-linux.so.2 (0x001d5000)
Version information:
/bin/bash:
libdl.so.2 (GLIBC_2.1) => /lib/tls/i686/cmov/libdl.so.2
libdl.so.2 (GLIBC_2.0) => /lib/tls/i686/cmov/libdl.so.2
libc.so.6 (GLIBC_2.4) => /lib/tls/i686/cmov/libc.so.6
libc.so.6 (GLIBC_2.3) => /lib/tls/i686/cmov/libc.so.6
libc.so.6 (GLIBC_2.11) => /lib/tls/i686/cmov/libc.so.6
libc.so.6 (GLIBC_2.3.4) => /lib/tls/i686/cmov/libc.so.6
libc.so.6 (GLIBC_2.1) => /lib/tls/i686/cmov/libc.so.6
libc.so.6 (GLIBC_2.2) => /lib/tls/i686/cmov/libc.so.6
libc.so.6 (GLIBC_2.0) => /lib/tls/i686/cmov/libc.so.6
/lib/libncurses.so.5:
libdl.so.2 (GLIBC_2.1) => /lib/tls/i686/cmov/libdl.so.2
libdl.so.2 (GLIBC_2.0) => /lib/tls/i686/cmov/libdl.so.2
libc.so.6 (GLIBC_2.1.3) => /lib/tls/i686/cmov/libc.so.6
libc.so.6 (GLIBC_2.4) => /lib/tls/i686/cmov/libc.so.6
libc.so.6 (GLIBC_2.3) => /lib/tls/i686/cmov/libc.so.6
libc.so.6 (GLIBC_2.2) => /lib/tls/i686/cmov/libc.so.6
libc.so.6 (GLIBC_2.3.4) => /lib/tls/i686/cmov/libc.so.6
libc.so.6 (GLIBC_2.1) => /lib/tls/i686/cmov/libc.so.6
libc.so.6 (GLIBC_2.0) => /lib/tls/i686/cmov/libc.so.6
/lib/tls/i686/cmov/libdl.so.2:
ld-linux.so.2 (GLIBC_PRIVATE) => /lib/ld-linux.so.2
libc.so.6 (GLIBC_2.1.3) => /lib/tls/i686/cmov/libc.so.6
libc.so.6 (GLIBC_2.1) => /lib/tls/i686/cmov/libc.so.6
libc.so.6 (GLIBC_2.0) => /lib/tls/i686/cmov/libc.so.6
libc.so.6 (GLIBC_PRIVATE) => /lib/tls/i686/cmov/libc.so.6
/lib/tls/i686/cmov/libc.so.6:
ld-linux.so.2 (GLIBC_PRIVATE) => /lib/ld-linux.so.2
ld-linux.so.2 (GLIBC_2.3) => /lib/ld-linux.so.2
ld-linux.so.2 (GLIBC_2.1) => /lib/ld-linux.so.2
lib() {
for libdir in "/lib" "/usr/lib" "/usr/local/lib"
do
ls -la "$libdir/$1"* 2>/dev/null | egrep -o "$1.*"
done
}
Преимущества:
- "Проверяет" не одну директорию
(по-хорошему, следовало бы вообще из системы вытягивать список библиотек, но это может разниться от системы к системе) - Честно показывает линки
(мало ли куда они ведут и какие проблемы создают) - Да и вообще, мне кажется, набрать 'lib libatk' не сильно быстрее 'ls /usr/lib/libatk*'
(особенно, если есть автодополнение)
В общем-то, да. Я просто к zsh ещё не привык :)
Раньше надоедало весь путь писать (много раз нажимать Tab),
а теперь ведь можно вообще /u/lib/+Tab.
В общем, не слишком полезная функция получилась, да.
Раньше надоедало весь путь писать (много раз нажимать Tab),
а теперь ведь можно вообще /u/lib/+Tab.
В общем, не слишком полезная функция получилась, да.