2008-12-03 11 views
150

Próbuję połączyć aplikację z g ++ w tym systemie lennym Debiana. Narzeka, że ​​nie może znaleźć określonych bibliotek. Konkretnym przykładem jest tutaj ImageMagick, ale mam podobne problemy z kilkoma innymi bibliotekami.ld nie można znaleźć istniejącej biblioteki

Wołam łącznik z:

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

ld narzeka:

/usr/bin/ld: cannot find -lmagic 

Jednak libmagic istnieje:

$ 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 

Jak zdiagnozować ten problem dalej, a co może być źle? Czy robię coś zupełnie głupiego?

Odpowiedz

138

Problemem jest łącznik szuka libmagic.so ale masz tylko libmagic.so.1

Szybkie Hack jest podlinkowujemy libmagic.so.1 do libmagic.so

+3

że działa, jestem trochę zakłopotany, że to nazwa pliku w zupełnie bezużyteczne sposób domyślnie - można podać żadnego wglądu dlaczego to zrobić to domyślnie? – maxpenguin

+0

Najprawdopodobniej jest to błędna konfiguracja skryptu instalacyjnego. – grepsedawk

+5

Foo.so.1 jest również dowiązaniem symbolicznym do foo.so.1.0.0. W ten sposób możesz mieć kilka wersji biblioteki w swoim systemie, a jeśli aplikacja potrzebuje konkretnej, może do niej linkować, podczas gdy ogólnie rzecz biorąc, najnowszą wybiera się za pomocą dowiązania symbolicznego. Nie wiem, dlaczego brakowało tego dowiązania symbolicznego. – Svante

4

Chyba jestem źle mylone libmagic lub -lmagic nie jest taka sama jak biblioteka ImageMagick. Oświadczasz, że chcesz ImageMagick.

ImageMagick wyposażony jest w narzędzie do dostarczania wszystkich odpowiednich opcji do kompilatora.

Ex:

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

Jak tylko formułowane przez grepsedawk, odpowiedź leży w opcji g++-l, nazywając ld. Jeśli spojrzeć na stronie man tego polecenia, można zrobić:

  • g++ -l:libmagic.so.1 [...]
  • lub: g++ -lmagic [...], jeśli masz dowiązania o nazwie libmagic.so na swojej drodze libs
+0

Albo podsumowując, usuń prefiks 'lib' podczas łączenia z nim, gdy używasz' -l'. '-llibmagic' powinno być' -lmagic'. – phyatt

30

It to konwencja Debiana dotycząca oddzielania bibliotek współużytkowanych w ich komponenty uruchomieniowe (libmagic1: /usr/lib/libmagic.so.1 → libmagic.so.1.0.0) i ich komponenty programistyczne (libmagic-dev: /usr/lib/libmagic.so → …).

Ponieważ nazwa sondy biblioteki to libmagic.so.1, jest to ciąg, który zostaje osadzony w pliku wykonywalnym, więc jest to plik ładowany podczas uruchamiania pliku wykonywalnego.

Jednakże, ponieważ biblioteka jest określona jako łącznik -lmagic, szuka libmagic.so, dlatego jest potrzebna do rozwoju.

Aby uzyskać szczegółowe informacje na temat działania tej funkcji w systemie Linux, patrz: Diego E. Pettenò: Linkers and names.


Krótko mówiąc, powinieneś apt-get install libmagic-dev. Zapewni to nie tylko libmagic.so, ale także inne pliki niezbędne do kompilacji, takie jak /usr/include/magic.h.

6

W Ubuntu można zainstalować libtool, która automatycznie rozwiązuje biblioteki.

$ sudo apt-get install libtool 

ten rozwiązano problem z ltdl dla mnie, który został zainstalowany jako libltdl.so.7 i nie zostało znalezione po prostu -lltdl w makijażu.

+0

to nie rozwiąże błędu ** nie może dobrze -LGL **. czy mógłbyś podać więcej informacji na temat tego, co robi libtool i jak rozwiązuje problemy z biblioteką? –

1

Zainstalowanie libgl1-mesa-dev z repozytorium Ubuntu rozwiązało ten problem.

+4

Z pewnością nie cierpisz na ten sam błąd skryptu co w wersji Maxpenguin w roku 2008. – Sophit

+0

rozwiązał mój problem. czy mógłbyś podać więcej informacji na temat tego, co to jest. i jak rozwiązuje ten problem? (mam na myśli: libgl1-mesa-dev). dzięki –

2

Jak wspomniano powyżej, linker szuka libmagic.so, ale masz tylko libmagic.so.1.

Aby rozwiązać ten problem, wystarczy wykonać aktualizację pamięci podręcznej.

ldconfig -v 

Aby sprawdzić można uruchomić:

$ ldconfig -p | grep libmagic 
Powiązane problemy