Como descobrir qual pacote de distribuição fornece uma determinada biblioteca

4

Estou procurando uma maneira de encontrar um determinado LDFLAG, como -lcryptopp , o pacote de distribuição que me fornece essa biblioteca, como libcrypto++-dev no Debian / Ubuntu.

Até agora, pesquisei essas bibliotecas à mão e com bom senso e usando, por exemplo, aptitude search , apt-file search e Google.

No entanto, agora estou montando uma VM na qual eu quero testar e compilar todos os pacotes da comunidade Haskell , e esses dependem de mais bibliotecas C do que eu posso procurar manualmente.

Como você, de maneira confiável, procura o pacote pelo seu nome de link?

Estou trabalhando em sistemas baseados em Debian, mas também interessado em soluções para outras distribuições. Qualquer coisa que facilite esse trabalho, seja um serviço web, alguma ferramenta ou banco de dados, ou um conhecimento inteligente sobre certos arquivos são nomeados.

Estou ciente de que isso não pode ser totalmente automatizado, já que dois pacotes diferentes podem fornecer tecnicamente bibliotecas com o mesmo nome. Estou bem com algo que pode encontrar mais dos pacotes.

    
por nh2 28.05.2013 / 10:32

2 respostas

2

Se você tiver os pacotes instalados em um sistema:

  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

Isso chama pkg-config com cada arquivo .pc instalado em seu sistema, consulta as bibliotecas que cada pacote usa e o caminho da biblioteca necessário (que são as bandeiras -l e -L respectivamente, conforme transmitidas ao compilador / linker). Isso é mais ou menos o que o script típico de configure faz (quando você está fazendo café ou algo mais produtivo do que assistir as linhas passarem).

Também é provável que haja alguns retardatários que não usam pkg-config e, em vez disso, instale um script -config :

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

Você ainda precisará fazer um pouco de grep-ing para encontrar exatamente o que está procurando, já que a saída do acima é o que o pacote precisa passar para o compilador ele incluirá os pacotes dependências próprias também . A biblioteca / bibliotecas que o próprio pacote fornece tendem a ser listadas primeiro, por exemplo,

/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  
                 ^^^^^^

Quando você tiver o arquivo .pc ou o arquivo -config identificado, confirme o pacote com dpkg :

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

ou o equivalente do gerenciador de pacotes local, por exemplo rpm -q --whatprovides /usr/lib/pkgconfig/libxml-2.0.pc

    
por 28.05.2013 / 11:23
1

Você pode listar os pacotes de todos os arquivos de cabeçalho instalados executando:

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

Isso levará muito tempo, mas você terá uma lista completa de todas as bibliotecas instaladas em seu sistema. Você também pode listar arquivos all .h dentro de todos pacotes:

apt-file search --regexp '\.h$'
    
por 28.05.2013 / 11:00