ld не может найти существующую библиотеку
Я пытаюсь связать приложение с g++ в этой системе Debian lenny. ЛД жалуется, что не может найти указанные библиотеки. Конкретный пример здесь-ImageMagick, но у меня тоже есть аналогичные проблемы с несколькими другими библиотеками.
Я вызываю компоновщика с:
g++ -w (..lots of .o files/include directories/etc..)
-L/usr/lib -lmagic
ЛД жалуется:
/usr/bin/ld: cannot find -lmagic
однако libmagic существует:
$ 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
как диагностировать эту проблему, и что может быть не так? Я делаю что-то совершенно глупое?
7 ответов
проблема компоновщик ищет libmagic.so
но у вас есть только libmagic.so.1
быстрый Хак к symlink libmagic.so.1
to libmagic.so
как только что сформулировал grepsedawk, ответ лежит в на g++
, называя ld
. Если вы посмотрите на man-страницу этой команды, вы можете либо сделать:
g++ -l:libmagic.so.1 [...]
- или:
g++ -lmagic [...]
, если у вас есть символическая ссылка с именем libmagic.так что в вашем пути libs
это соглашение Debian для разделения общих библиотек на компоненты среды выполнения (libmagic1: /usr/lib/libmagic.so.1 → libmagic.so.1.0.0
) и их компонентов разработка (libmagic-dev: /usr/lib/libmagic.so → …
).
потому что soname библиотеки libmagic.so.1
, это строка, которая внедряется в исполняемый файл, так что это файл, который загружается при запуске исполняемого файла.
однако, потому что библиотека указана как -lmagic
для компоновщика он ищет libmagic.so
, поэтому он необходим для развитие.
посмотреть Диего Э. Петтено: линкеры и имена подробнее о том, как все это работает на Linux.
короче говоря, вы должны apt-get install libmagic-dev
. Это не только даст вам libmagic.so
, но и другие файлы, необходимые для компиляции, как /usr/include/magic.h
.
в Ubuntu, вы можете установить libtool
который автоматически разрешает библиотеки.
$ sudo apt-get install libtool
это решило проблему с ltdl
для меня, который был установлен как libltdl.so.7
и не было найдено как просто -lltdl
в make.
Если я не ошибаюсь libmagic
или -lmagic
- это не та же библиотека, что и ImageMagick. Вы заявляете, что хотите ImageMagick.
ImageMagick поставляется с утилитой для предоставления всех соответствующих опций компилятору.
Ex:
g++ program.cpp `Magick++-config --cppflags --cxxflags --ldflags --libs` -o "prog"
как упоминалось выше, компоновщик ищет libmagic.so
, но только libmagic.so.1
.
чтобы решить эту проблему, просто выполните кэш обновления.
ldconfig -v
для проверки вы можете запустить:
$ ldconfig -p | grep libmagic