ld non riesce a trovare una libreria esistente

Sto tentando di colbind un’applicazione con g ++ su questo sistema lenny di Debian. ld 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.

Sto chiamando il linker con:

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

lamenta:

 /usr/bin/ld: cannot find -lmagic 

Tuttavia, esiste libagic:

 $ 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 faccio a diagnosticare ulteriormente questo problema e cosa potrebbe essere sbagliato? Sto facendo qualcosa di completamente stupido?

Il problema è che il linker sta cercando libmagic.so ma hai solo libmagic.so.1

Un trucco rapido è di libmagic.so.1 simbolicamente libmagic.so.1 a libmagic.so

Come appena formulato da grepsedawk, la risposta sta nell’opzione -l di g++ , che chiama ld . Se guardi la pagina man di questo comando, puoi fare:

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

È convenzione Debian separare le librerie condivise nei loro componenti runtime ( libmagic1: /usr/lib/libmagic.so.1 → libmagic.so.1.0.0 ) e i 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 in modo che sia il file caricato quando viene eseguito l’eseguibile.

Tuttavia, poiché la libreria è specificata come -lmagic nel linker, cerca libmagic.so , che è il motivo per cui è necessario 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.so ma anche altri file necessari per la compilazione come /usr/include/magic.h .

In Ubuntu, puoi installare libtool che risolve automaticamente le librerie.

 $ sudo apt-get install libtool 

Questo ha risolto un problema con ltdl per me, che era stato installato come libltdl.so.7 e non è stato trovato come semplicemente -lltdl nel make.

A meno che non sia sbagliato, libmagic o -lmagic non è la stessa libreria di ImageMagick. Si afferma che si desidera 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" 

Come menzionato sopra, 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 

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