4

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

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

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

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

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

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

2 ответа2

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

1

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

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

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

apt-file search --regexp '\.h$'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .