LD não consegue encontrar uma biblioteca existente

169

Estou tentando vincular um aplicativo ao g ++ neste sistema Lenny da Debian. ld está reclamando que não consegue encontrar bibliotecas especificadas. O exemplo específico aqui é o ImageMagick, mas também estou tendo problemas semelhantes com algumas outras bibliotecas.

Estou ligando para o vinculador com:

g++ -w (..lots of .o files/include directories/etc..) \
-L/usr/lib -lmagic

ld reclama:

/usr/bin/ld: cannot find -lmagic

No entanto, libmagic existe:

$ locate libmagic.so
/usr/lib/libmagic.so.1
/usr/lib/libmagic.so.1.0.0
$ ls -all /usr/lib/libmagic.so.1*
lrwxrwxrwx 1 root root    17 2008-12-01 03:52 /usr/lib/libmagic.so.1 -> libmagic.so.1.0.0
-rwxrwxrwx 1 root root 84664 2008-09-09 00:05 /usr/lib/libmagic.so.1.0.0
$ ldd /usr/lib/libmagic.so.1.0.0 
    linux-gate.so.1 =>  (0xb7f85000)
    libz.so.1 => /usr/lib/libz.so.1 (0xb7f51000)
    libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7df6000)
    /lib/ld-linux.so.2 (0xb7f86000)
$ sudo ldconfig -v | grep "libmagic"
    libmagic.so.1 -> libmagic.so.1.0.0

Como diagnosticar mais esse problema e o que pode estar errado? Estou fazendo algo completamente estúpido?

maxpenguin
fonte

Respostas:

158

O problema é que o vinculador está procurando, libmagic.somas você só temlibmagic.so.1

Um truque rápido é o link simbólico libmagic.so.1paralibmagic.so

grepsedawk
fonte
3
isso funciona, fico meio perplexo que ele nomearia o arquivo de uma maneira completamente inútil por padrão - você pode fornecer alguma idéia de por que isso faria isso por padrão?
maxpenguin
5
O foo.so.1 também é um link simbólico para foo.so.1.0.0. Dessa forma, você pode ter várias versões de uma biblioteca em seu sistema e, se um aplicativo precisar de um específico, ele poderá vincular a ele, enquanto, em geral, o mais novo é escolhido pelo link simbólico. Não sei por que esse link simbólico estava ausente.
Svante
46
libmagic.so.1 é o soname, usado pelo vinculador dinâmico; O libmagic.so é usado pelo vinculador e geralmente está junto com os cabeçalhos no pacote -dev. O link simbólico pode estar ausente porque o pacote -dev não foi instalado.
CesarB
13
Eu tive o mesmo problema ... em vez de fazer o "hack", instalei a versão "* -devel" e corrigi a compilação.
Trevor Boyd Smith
4
Como vincular libmagic.so.1 a libmagic.so? E onde encontrar esses pacotes "devel"
Preto
69

Conforme formulado por grepsedawk, a resposta está na -lopção de g++ligar ld. Se você olhar a página de manual deste comando, poderá:

  • g++ -l:libmagic.so.1 [...]
  • ou g++ -lmagic [...]:, se você tiver um link simbólico chamado libmagic.so no caminho da sua biblioteca
Piotr Lesnicki
fonte
Ou, em resumo, remova o libprefixo ao vincular a ele ao usar -l. -llibmagicdeveria ser -lmagic.
Phyatt #
31

É convenção do Debian separar bibliotecas compartilhadas em seus componentes de tempo de execução ( libmagic1: /usr/lib/libmagic.so.1 → libmagic.so.1.0.0) e em seus componentes de desenvolvimento ( libmagic-dev: /usr/lib/libmagic.so → …).

Como o nome do filho da biblioteca é libmagic.so.1, essa é a string que é incorporada ao executável, e esse é o arquivo carregado quando o executável é executado.

No entanto, como a biblioteca é especificada quanto -lmagicao vinculador, ela procura libmagic.so, e é por isso que é necessária para o desenvolvimento.

Veja Diego E. Pettenò: Linkers e nomes para obter detalhes sobre como tudo isso funciona no Linux.


Em suma, você deveria apt-get install libmagic-dev. Isso não apenas fornecerá a você, libmagic.somas também outros arquivos necessários para a compilação /usr/include/magic.h.

efémero
fonte
7

No Ubuntu, você pode instalar o libtoolque resolve as bibliotecas automaticamente.

$ sudo apt-get install libtool

Isso resolveu um problema ltdlpara mim, que havia sido instalado libltdl.so.7e não foi encontrado simplesmente -lltdlna marca.

Mr Ed
fonte
não resolveu o erro não pode multar -LGL . você poderia fornecer mais informações sobre o que a libtool faz e como resolve os problemas da biblioteca?
Shahryar Saljoughi
4

A menos que eu esteja muito enganado libmagicou -lmagicnão seja a mesma biblioteca que o ImageMagick. Você declara que deseja o ImageMagick.

O ImageMagick vem com um utilitário para fornecer todas as opções apropriadas ao compilador.

Ex:

g++ program.cpp `Magick++-config --cppflags --cxxflags --ldflags --libs` -o "prog"
Brian Gianforcaro
fonte
4

Como mencionado acima, o vinculador está procurando libmagic.so, mas você só tem libmagic.so.1.

Para resolver esse problema, basta executar um cache de atualização.

ldconfig -v 

Para verificar se você pode executar:

$ ldconfig -p | grep libmagic
Miguel Ignacio Iglesias
fonte
1

A instalação de libgl1-mesa-dev a partir do repositório Ubuntu resolveu esse problema para mim.

Kirenpillay
fonte
5
Certamente você não está sofrendo o mesmo bug script como maxpenguin em 2008.
Sophit
resolveu meu problema. você poderia dar mais informações sobre o que é? e como ele resolve esse problema? (quero dizer: libgl1-mesa-dev). obrigado
Shahryar Saljoughi