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?
linux
gcc
linker
shared-libraries
shared-objects
maxpenguin
fonte
fonte
Conforme formulado por grepsedawk, a resposta está na
-l
opção deg++
ligarld
. Se você olhar a página de manual deste comando, poderá:g++ -l:libmagic.so.1 [...]
g++ -lmagic [...]
:, se você tiver um link simbólico chamado libmagic.so no caminho da sua bibliotecafonte
lib
prefixo ao vincular a ele ao usar-l
.-llibmagic
deveria ser-lmagic
.É 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
-lmagic
ao vinculador, ela procuralibmagic.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.so
mas também outros arquivos necessários para a compilação/usr/include/magic.h
.fonte
No Ubuntu, você pode instalar o
libtool
que resolve as bibliotecas automaticamente.Isso resolveu um problema
ltdl
para mim, que havia sido instaladolibltdl.so.7
e não foi encontrado simplesmente-lltdl
na marca.fonte
A menos que eu esteja muito enganado
libmagic
ou-lmagic
nã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:
fonte
Como mencionado acima, o vinculador está procurando
libmagic.so
, mas você só temlibmagic.so.1
.Para resolver esse problema, basta executar um cache de atualização.
Para verificar se você pode executar:
fonte
A instalação de libgl1-mesa-dev a partir do repositório Ubuntu resolveu esse problema para mim.
fonte