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?
linux
gcc
linker
shared-libraries
shared-objects
maxpenguin
źródło
źródło
Jak właśnie sformułował grepsedawk, odpowiedź leży w
-l
możliwościg++
dzwonieniald
. Jeśli spojrzysz na stronę podręcznika tego polecenia, możesz zrobić:g++ -l:libmagic.so.1 [...]
g++ -lmagic [...]
jeśli masz dowiązanie symboliczne o nazwie libmagic.so w ścieżce do bibliotekźródło
lib
prefiks podczas łączenia z nim podczas używania-l
.-llibmagic
powinno być-lmagic
.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, szukalibmagic.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.so
ale także inne pliki niezbędne do kompilacji, takie jak/usr/include/magic.h
.źródło
W Ubuntu możesz zainstalować,
libtool
co automatycznie rozwiązuje biblioteki.To rozwiązało
ltdl
dla mnie problem , który został zainstalowany jakolibltdl.so.7
i nie został znaleziony tak prosto-lltdl
w marce.źródło
Chyba że się mylę
libmagic
lub-lmagic
nie 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:
źródło
Jak wspomniano powyżej, linker szuka
libmagic.so
, ale masz tylkolibmagic.so.1
.Aby rozwiązać ten problem, po prostu wykonaj aktualizację pamięci podręcznej.
Aby sprawdzić, czy możesz uruchomić:
źródło
Zainstalowanie libgl1-mesa-dev z repozytorium Ubuntu rozwiązało ten problem.
źródło