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?

Odpowiedzi:


158

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

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


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

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.


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.


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"

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

1

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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.