Как узнать, какой дистрибутив предоставляет данную библиотеку
Я ищу способ найти для данного 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$'