Non riesco a trovare una biblioteca esistente


169

Sto tentando di collegare un'applicazione con g ++ su questo sistema Debian Lenny. Si lamenta che non riesce a trovare le librerie specificate. L'esempio specifico qui è ImageMagick, ma sto riscontrando problemi simili anche con alcune altre librerie.

Chiamo il linker con:

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

mi lamento:

/usr/bin/ld: cannot find -lmagic

Tuttavia, esiste libmagic:

$ 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

Come posso diagnosticare ulteriormente questo problema e cosa potrebbe esserci di sbagliato? Sto facendo qualcosa di completamente stupido?

Risposte:


158

Il problema è che il linker sta cercando libmagic.soma hai sololibmagic.so.1

Un trucco rapido è il collegamento simbolico libmagic.so.1alibmagic.so


3
funziona, sono un po 'perplesso sul fatto che nominerebbe il file in modo completamente inutile per impostazione predefinita - puoi fornire qualche idea sul perché lo farebbe per impostazione predefinita?
maxpenguin,

5
Foo.so.1 è anche un collegamento simbolico a foo.so.1.0.0. In questo modo, puoi avere diverse versioni di una libreria nel tuo sistema e se un'applicazione ha bisogno di una specifica, può collegarsi ad essa, mentre in generale la più recente viene scelta tramite symlink. Non so perché mancasse questo link simbolico.
Svante,

46
libmagic.so.1 è il soname, usato dal linker dinamico; libmagic.so è usato dal linker e di solito è insieme alle intestazioni nel pacchetto -dev. Il collegamento simbolico potrebbe mancare perché il pacchetto -dev non è stato installato.
CesarB,

13
Ho avuto lo stesso problema ... invece di fare "hack" ho installato la versione "* -devel" e risolto la compilazione.
Trevor Boyd Smith,

4
Come collegare simbolicamente libmagic.so.1 a libmagic.so? E dove trovare quei pacchetti "devel"
Black,

69

Come appena formulato da grepsedawk, la risposta sta -lnell'opzione di g++chiamare ld. Se guardi la pagina man di questo comando, puoi fare:

  • g++ -l:libmagic.so.1 [...]
  • oppure: g++ -lmagic [...]se hai un link simbolico chiamato libmagic.so nel tuo percorso libs

O in sintesi, rimuovere il libprefisso quando si collega ad esso durante l'utilizzo -l. -llibmagicdovrebbe essere -lmagic.
Phyatt,

31

È convenzione Debian separare le librerie condivise nei loro componenti di runtime ( libmagic1: /usr/lib/libmagic.so.1 → libmagic.so.1.0.0) e nei loro componenti di sviluppo ( libmagic-dev: /usr/lib/libmagic.so → …).

Poiché il soname della libreria è libmagic.so.1, questa è la stringa che viene incorporata nell'eseguibile, quindi è il file che viene caricato quando viene eseguito l'eseguibile.

Tuttavia, poiché la libreria viene specificata come -lmagiclinker, cerca libmagic.so, motivo per cui è necessaria per lo sviluppo.

Vedi Diego E. Pettenò: Linker e nomi per i dettagli su come tutto questo funziona su Linux.


In breve, dovresti apt-get install libmagic-dev. Questo non solo ti darà libmagic.soma anche altri file necessari per la compilazione come /usr/include/magic.h.


7

In Ubuntu, è possibile installare libtoolche risolve automaticamente le librerie.

$ sudo apt-get install libtool

Ciò ha risolto un problema con ltdlme, che era stato installato come libltdl.so.7e non era stato trovato semplicemente -lltdlnella marca.


non ha risolto l'errore non può andare bene -LGL . potresti per favore fornire maggiori informazioni su ciò che fa libtool e su come risolve i problemi delle biblioteche?
Shahryar Saljoughi,

4

A meno che non mi sbagli di grosso libmagico -lmagicnon sia la stessa libreria di ImageMagick. Dichiari di voler ImageMagick.

ImageMagick viene fornito con un'utilità per fornire tutte le opzioni appropriate al compilatore.

Ex:

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

4

Come accennato in precedenza, il linker sta cercando libmagic.so, ma hai solo libmagic.so.1.

Per risolvere questo problema basta eseguire una cache di aggiornamento.

ldconfig -v 

Per verificare puoi eseguire:

$ ldconfig -p | grep libmagic

1

L'installazione di libgl1-mesa-dev dal repository di Ubuntu ha risolto questo problema per me.


5
Sicuramente non stai soffrendo dello stesso bug di script di maxpenguin nel 2008.
Sophit,

ha risolto il mio problema. potresti per favore fornire maggiori informazioni su cosa sia. e come risolve questo problema? (intendo: libgl1-mesa-dev). grazie
Shahryar Saljoughi,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.