Я пытаюсь связать приложение с g ++ в этой системе Debian lenny. ld жалуется, что не может найти указанные библиотеки. Конкретным примером здесь является 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
Как мне диагностировать эту проблему дальше, и что может быть не так? Я делаю что-то совершенно глупое?
linux
gcc
linker
shared-libraries
shared-objects
maxpenguin
источник
источник
Как только что сформулировал grepsedawk, ответ заключается в
-l
возможностиg++
вызоваld
. Если вы посмотрите на страницу руководства этой команды, вы можете сделать:g++ -l:libmagic.so.1 [...]
g++ -lmagic [...]
если у вас есть символическая ссылка с именем libmagic.so в пути libsисточник
lib
префикс при ссылке на него при использовании-l
.-llibmagic
должно быть-lmagic
.По соглашению Debian разделяемые библиотеки делятся на компоненты времени выполнения (
libmagic1: /usr/lib/libmagic.so.1 → libmagic.so.1.0.0
) и компоненты разработки (libmagic-dev: /usr/lib/libmagic.so → …
).Поскольку имя библиотеки -
libmagic.so.1
это строка, которая встраивается в исполняемый файл, и это файл, который загружается при запуске исполняемого файла.Однако, поскольку библиотека указана относительно
-lmagic
компоновщика, она ищетlibmagic.so
, поэтому она необходима для разработки.Смотрите Diego E. Pettenò: Линкеры и имена, чтобы узнать, как все это работает в Linux.
Короче, ты должен
apt-get install libmagic-dev
. Это даст не только вам,libmagic.so
но и другие файлы, необходимые для компиляции, как/usr/include/magic.h
.источник
В Ubuntu вы можете установить,
libtool
которая автоматически разрешает библиотеки.Это решило проблему
ltdl
для меня, которая была установлена какlibltdl.so.7
и не была найдена просто-lltdl
в make.источник
Если я не ошибаюсь
libmagic
или-lmagic
не является той же библиотекой, что и ImageMagick. Вы заявляете, что хотите ImageMagick.ImageMagick поставляется с утилитой для предоставления всех соответствующих опций компилятору.
Пример:
источник
Как уже упоминалось выше, компоновщик ищет
libmagic.so
, но у вас есть толькоlibmagic.so.1
.Для решения этой проблемы просто выполните обновление кеша.
Для проверки вы можете запустить:
источник
Установка libgl1-mesa-dev из репозитория Ubuntu решила эту проблему для меня.
источник