Как проверить, установлена ​​ли библиотека?

В Linux, как я могу проверить, установлена ​​ли библиотека или нет? (из командной строки конечно).

В моем конкретном случае сейчас я хочу проверить, установлен ли libjpeg.

10 ответов

Решение

Чтобы сделать это независимо от дистрибутива *, вы можете использовать ldconfig с grep, например:

ldconfig -p | grep libjpeg

Если libjpeg не установлен, вывод не будет. Если он установлен, вы получите строку для каждой доступной версии.

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

Если по какой-то причине путь к ldconfig не задан, вы можете попытаться вызвать его, используя полный путь, обычно /sbin/ldconfig,

**99% случаев *

Вы можете проверить это с менеджером пакетов вашего дистрибутива (aptitude, yum, ...), но так как вы не дали свой дистрибутив, я не могу дать вам правильную команду.

Другим способом можно бежать gcc -ljpeg, если вы получаете 'ld: library not found for -ljpeg', это означает, что gcc не нашел библиотеку (но это не значит, что она не установлена), если вы получите что-то вроде 'Undefined symbols: "_main", from: ...'это означает, что libjpeg был найден.

locate libjpeg; ls /usr/lib/libjpeg*; ls /lib/libjpeg* какой-то другой способ узнать, установлена ​​ли библиотека в системе

Есть много других способов проверить, что, если вы дадите нам больше контекста (зачем вам нужно проверять, установлен ли libjpeg), мы могли бы дать вам лучшее решение для вашего конкретного случая.

Я использую утилиту whereis.

Образец:

l1feh4ck3r@xxx:~$ whereis libjpeg
libjpeg: /usr/lib/libjpeg.so /usr/lib/libjpeg.a /usr/lib/libjpeg.la

Я использую это:

gcc -lpng

Когда библиотека установлена, она выдает:

undefined reference to 'main'

Когда библиотека не установлена:

cannot find -lpng

Для распространения на основе deb вы можете сделать

dpkg -s packagename

Или, если вы знаете только имя файла, используйте

locate filename

Имя файла обычно libsomething.so[.version].

В системах на основе Redhat можно использовать pkg-config, чтобы проверить, установлена ​​библиотека или нет. Многие двоичные файлы rpm на самом деле выполняют те же проверки перед продолжением установки, поэтому мы можем разумно полагаться на их достоверность.

pkg-config --cflags jpeg

pkg-config --libs jpeg

pkg-config --cflags "jpeg >= 1.0.0" # for version check
pkg-config  --modversion jpeg | awk -F. '{ printf "0x%02X%02X%02X\n",$1,$2,$3 }' #version check

Это делается инструментами настройки на Linux все время.

Посмотрите этот урок об autoconf и KDevelop.

Другие трюки будут использовать такие команды, как ldconfig а также dpkg,

В Ubuntu 20.04 я могу отображать множество важной информации о пакете с помощью aptitude.

      % aptitude show libssl-dev
Package: libssl-dev                      
Version: 1.1.1f-1ubuntu2.1
State: installed
Automatically installed: no
Multi-Arch: same
Priority: optional
Section: libdevel
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Architecture: amd64
Uncompressed Size: 8,006 k
Depends: libssl1.1 (= 1.1.1f-1ubuntu2.1)
Suggests: libssl-doc
Conflicts: libssl1.0-dev
Breaks: libssl-dev:i386 (!= 1.1.1f-1ubuntu2.1)
Replaces: libssl-dev:i386 (< 1.1.1f-1ubuntu2.1)
Description: Secure Sockets Layer toolkit - development files
 This package is part of the OpenSSL project's implementation of the SSL and TLS cryptographic protocols for secure communication over
 the Internet. 
 
 It contains development libraries, header files, and manpages for libssl and libcrypto.
Homepage: https://www.openssl.org/

Чтобы найти, какой пакет предоставит определенный файл, я нашелapt-fileочень полезно - некоторые инструкции находятся здесь: https://linuxhint.com/find_that_package_contains_specified_file_ubuntu/

      % apt-file search 'libjpeg.so'          
darktable: /usr/lib/x86_64-linux-gnu/darktable/plugins/imageio/format/libjpeg.so
libjpeg-turbo8: /usr/lib/x86_64-linux-gnu/libjpeg.so.8
libjpeg-turbo8: /usr/lib/x86_64-linux-gnu/libjpeg.so.8.2.2
libjpeg-turbo8-dev: /usr/lib/x86_64-linux-gnu/libjpeg.so
libjpeg62: /usr/lib/x86_64-linux-gnu/libjpeg.so.62
libjpeg62: /usr/lib/x86_64-linux-gnu/libjpeg.so.62.0.0
libjpeg62-dev: /usr/lib/x86_64-linux-gnu/libjpeg.so
libjpeg9: /usr/lib/x86_64-linux-gnu/libjpeg.so.9
libjpeg9: /usr/lib/x86_64-linux-gnu/libjpeg.so.9.4.0
libjpeg9-dev: /usr/lib/x86_64-linux-gnu/libjpeg.so
libxine2-misc-plugins: /usr/lib/x86_64-linux-gnu/xine/plugins/2.7/xineplug_decode_libjpeg.so
nsight-systems: /usr/lib/nsight-systems/Host-x86_64/libjpeg.so.8

Вы также можете попробовать использовать dpkg, чтобы проверить, установлен ли он.

dpkg --list | grep [some_key_words_of_your_lib]

Кроме того, на CentOS вы можете попробовать это.

rpm -qa [lib_name]

как Ким выше

dpkg -s имя пакета

      [[ $(dpkg -s libsox-fmt-pulse 2> /dev/null) =~ "is not installed" ]] && sudo apt install libsox-fmt-pulse # for hdmi output
Другие вопросы по тегам