Как узнать, какой дистрибутив предоставляет данную библиотеку

Я ищу способ найти для данного LDFLAG, как -lcryptopp, дистрибутив, который предоставляет мне эту библиотеку, как libcrypto++-dev на Debian/Ubuntu.

До сих пор я просматривал эти библиотеки вручную и по здравому смыслу, используя, например, aptitude search, apt-file searchи гугл.

Однако сейчас я создаю виртуальную машину, в которой я хочу протестировать и скомпилировать все пакеты сообщества Haskell, и они зависят от большего количества библиотек C, чем я могу найти вручную.

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

Я работаю над системами на основе Debian, но также интересуюсь решениями для других дистрибутивов. Мы ценим все, что облегчит эту работу, будь то веб-служба, какой-либо инструмент или база данных, или умные знания об определенных файлах.

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

2 ответа

Если у вас установлены пакеты в системе:

  for pc in $(find /usr/lib/pkgconfig/ ${PKG_CONFIG_PATH//:/ } -maxdepth 1 -name "*.pc"); do
      printf "$pc " 
      pp=${pc/#*\/} 
      pp=${pp/%.pc/}
      pkg-config --modversion --libs ${pp}
      printf "\n"
  done

Это звонки pkg-config с каждым установленным .pc файла в вашей системе, он запрашивает библиотеки, используемые каждым пакетом, и требуемый путь к библиотеке (которые являются -l а также -L флаги соответственно, как передано компилятору / компоновщику). Это более или менее то, что типичный configure Сценарий делает (когда вы делаете кофе или что-то более продуктивное, чем просмотр прокрутки строк).

Также, вероятно, будет несколько отставших, которые не используют pkg-configи вместо этого установите -config сценарий:

for pkg in $(find ${PATH//:/ } -maxdepth 1 -type f -name "*-config"); do 
    printf "$pkg " 
    $pkg --version --libs
    printf "\n"
done

Вам все равно нужно будет выполнить немного grep-поиска, чтобы найти именно то, что вы ищете, поскольку вывод вышеупомянутого - это то, что пакет должен передать компилятору, он также будет включать собственные зависимости пакетов. Библиотеки / библиотеки, которые предоставляет сам пакет, имеют тенденцию быть перечисленными сначала, хотя, например

/usr/bin/xine-config 1.1.7
-L/usr/lib -lxine -lz -lresolv -lnsl -pthread -lrt
           ^^^^^^
/usr/local/lib/pkgconfig/flac.pc 1.2.1
-L/usr/local/lib -lFLAC -lm  
                 ^^^^^^

Когда у вас есть .pc файл или -config файл идентифицирован, подтвердите пакет dpkg:

 dpkg -S /usr/lib/pkgconfig/libxml-2.0.pc
 libxml2-dev: /usr/lib/pkgconfig/libxml-2.0.pc

или локальный эквивалент менеджера пакетов, например rpm -q --whatprovides /usr/lib/pkgconfig/libxml-2.0.pc

Вы можете получить список пакетов всех установленных заголовочных файлов, выполнив:

find / -name '*.h' | xargs -i apt-file search {}

Это займет много времени, но у вас будет полный список всех библиотек, установленных в вашей системе. Вы также можете перечислить все.h файлы во всех пакетах:

apt-file search --regexp '\.h$'
Другие вопросы по тегам