ld nie może znaleźć istniejącej biblioteki

169

Próbuję połączyć aplikację z g ++ w tym systemie Debian lenny. ld skarży się, że nie może znaleźć określonych bibliotek. Konkretnym przykładem jest tutaj ImageMagick, ale mam podobne problemy z kilkoma innymi bibliotekami.

Dzwonię do konsolidatora 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 dalej zdiagnozować ten problem i co może być nie tak? Czy robię coś zupełnie głupiego?

maxpenguin
źródło

Odpowiedzi:

158

Problem polega na tym, że konsolidator szuka, libmagic.soale masz tylkolibmagic.so.1

Szybki hack to link symboliczny libmagic.so.1dolibmagic.so

grepsedawk
źródło
3
to działa, jestem trochę zakłopotany, że domyślnie nazwałby plik w całkowicie bezużyteczny sposób - czy możesz podać jakiś wgląd, dlaczego miałby to robić domyślnie?
maxpenguin
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 się do niej łączyć, podczas gdy na ogół najnowsza jest wybierana przez dowiązanie symboliczne. Nie wiem, dlaczego brakowało tego linku.
Svante
46
libmagic.so.1 to nazwa sondy używana przez linker dynamiczny; libmagic.so jest używany przez konsolidator i zwykle jest razem z nagłówkami w pakiecie -dev. Może brakować łącza symbolicznego, ponieważ pakiet -dev nie został zainstalowany.
CesarB,
13
Miałem ten sam problem ... zamiast robić "hack", zainstalowałem wersję "* -devel" i naprawiłem kompilację.
Trevor Boyd Smith
4
Jak utworzyć dowiązanie symboliczne libmagic.so.1 do libmagic.so? A gdzie znaleźć te pakiety rozwojowe
Black
68

Jak właśnie sformułował grepsedawk, odpowiedź leży w -lmożliwości g++dzwonienia ld. Jeśli spojrzysz na stronę podręcznika tego polecenia, możesz zrobić:

  • g++ -l:libmagic.so.1 [...]
  • lub: g++ -lmagic [...]jeśli masz dowiązanie symboliczne o nazwie libmagic.so w ścieżce do bibliotek
Piotr Lesnicki
źródło
Podsumowując, usuń libprefiks podczas łączenia z nim podczas używania -l. -llibmagicpowinno być -lmagic.
phyatt
31

Konwencją Debiana jest rozdzielanie bibliotek współdzielonych na ich komponenty wykonawcze (libmagic1: /usr/lib/libmagic.so.1 → libmagic.so.1.0.0 ) i komponenty programistyczne ( libmagic-dev: /usr/lib/libmagic.so → …).

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

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

Zobacz Diego E. Pettenò: Łączniki i nazwy, aby uzyskać szczegółowe informacje o tym, jak to wszystko działa w systemie Linux.


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

ephemient
źródło
7

W Ubuntu możesz zainstalować, libtoolco automatycznie rozwiązuje biblioteki.

$ sudo apt-get install libtool

To rozwiązało ltdldla mnie problem , który został zainstalowany jako libltdl.so.7i nie został znaleziony tak prosto -lltdlw marce.

Panie Ed
źródło
to nie rozwiązało 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 biblioteki?
Shahryar Saljoughi
4

Chyba że się mylę libmagiclub -lmagicnie jest to ta sama biblioteka co ImageMagick. Oświadczasz, że chcesz ImageMagick.

ImageMagick jest wyposażony w narzędzie, które dostarcza kompilatorowi wszystkie odpowiednie opcje.

Dawny:

g++ program.cpp `Magick++-config --cppflags --cxxflags --ldflags --libs` -o "prog"
Brian Gianforcaro
źródło
4

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

Aby rozwiązać ten problem, po prostu wykonaj aktualizację pamięci podręcznej.

ldconfig -v 

Aby sprawdzić, czy możesz uruchomić:

$ ldconfig -p | grep libmagic
Miguel Ignacio Iglesias
źródło
1

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

kirenpillay
źródło
5
Z pewnością nie cierpisz na ten sam błąd skryptu co maxpenguin w 2008 roku.
Sophit
rozwiązało 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
Shahryar Saljoughi