Determine o nome da biblioteca estática / dinâmica

4

Muitas vezes, estou usando snippets de código C de terceiros que usam uma biblioteca Unix / Linux C, um exemplo #include <glib.h> , #include <net/if.h> . E eles exigem que eu saiba o nome do arquivo da biblioteca específica ou o nome do pkg-config, um exemplo -lglib-2.0 , -lbluetooth , pkg-config --libs dbus-1 . Note que muitos deles diferem do arquivo de cabeçalho com um '2.0', '1', então você não pode adivinhá-lo.

Como posso descobrir o nome exato do arquivo de biblioteca que uma API / biblioteca possui? Usando meus exemplos acima; Como eu acho que o arquivo de biblioteca #include <glib.h> é chamado -lglib-2.0 ? É muito frustrante que as referências on-line do Glib / dbus / todas elas não digam apenas "o nome do arquivo da biblioteca é glib-2.0".

Existe algum comando de terminal que eu possa usar para descobrir isso? Existem utilidades que eu possa usar para descobrir isso? As referências on-line de API / biblioteca são muito ruins para descobrir isso.

Se eu quiser encontrar onde o hci.h está localizado, posso facilmente ir em locate hci.h e encontrar sua localização. Existe algo como um comando de terminal para descobrir o nome da biblioteca?

    
por Jake M 11.06.2016 / 05:04

1 resposta

2

Não há uma maneira geral de saber qual biblioteca é necessária para usar uma função específica. Você precisa examinar a documentação dessa biblioteca. Um tutorial bem escrito ou uma referência de API deve informar, esse é o seu trabalho.

Você pode pelo menos ter uma idéia de qual biblioteca pacote é necessária: é o mesmo pacote de biblioteca que contém o arquivo de cabeçalho. Como determinar qual pacote contém o arquivo de cabeçalho depende da distribuição, por exemplo dpkg -S /usr/include/glib-2.0/glib.h no Debian / Ubuntu / Mint /…, rpm -qf /usr/include/glib-2.0/glib.h no RHEL / CentOS / Fedora /…, etc. Depois de conhecer o pacote da biblioteca, listar seu conteúdo para encontrar o que contém .so arquivos, por exemplo,

dpkg -L libglib2.0-dev | grep '\.so$'
rpm -qlf /usr/include/glib-2.0/glib.h | grep '\.so$'

Com o Glib, existem vários arquivos .so , e não há nenhuma maneira automática de dizer quais são necessários para uma função específica (pode haver mais de um).

Se a biblioteca usar pkg-config , você deverá usá-la em vez de codificar o cabeçalho e os caminhos da biblioteca. Nem todas as bibliotecas o usam no entanto. Você pode dizer normalmente porque o pacote da biblioteca da sua distribuição deve depender do pacote pkg-config (por exemplo, dpkg -s libglib2.0-dev |grep '^Depends:.*pkg-config' ).

Se a documentação estiver muito ruim, tente listar os símbolos definidos pela biblioteca:

nm -D /usr/lib/x86_64-linux-gnu/libgio-2.0.so |awk '$2=="T" {print $3}'

Esta não é uma maneira segura, porque não lhe dirá se outra biblioteca também é necessária.

    
por 11.06.2016 / 14:52