Я не могу найти существующую библиотеку - PullRequest
160 голосов
/ 03 декабря 2008

Я пытаюсь связать приложение с 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

Как мне диагностировать эту проблему дальше, и что может быть не так? Я что-то делаю совершенно глупо?

Ответы [ 7 ]

150 голосов
/ 03 декабря 2008

Проблема в том, что компоновщик ищет libmagic.so, но у вас есть только libmagic.so.1

Быстрый взлом на символическую ссылку libmagic.so.1 на libmagic.so

65 голосов
/ 03 декабря 2008

Как только что сформулировал grepsedawk, ответ лежит в опции -l g++, вызывая ld. Если вы посмотрите на справочную страницу этой команды, вы можете сделать:

  • g++ -l:libmagic.so.1 [...]
  • или: g++ -lmagic [...], если у вас есть символическая ссылка с именем libmagic.so в пути libs
31 голосов
/ 27 октября 2010

В Debian принято разделять разделяемые библиотеки на компоненты времени выполнения (libmagic1: /usr/lib/libmagic.so.1 → libmagic.so.1.0.0) и компоненты разработки (libmagic-dev: /usr/lib/libmagic.so → …).

Поскольку имя библиотеки libmagic.so.1, это строка, которая встраивается в исполняемый файл, так что это файл, который загружается при запуске исполняемого файла.

Однако, поскольку библиотека указана для компоновщика как -lmagic, она ищет libmagic.so, поэтому она необходима для разработки.

См. Диего Э. Петтено: Линкеры и имена для получения подробной информации о том, как все это работает в Linux.


Короче, вы должны apt-get install libmagic-dev. Это даст вам не только libmagic.so, но и другие файлы, необходимые для компиляции, такие как /usr/include/magic.h.

7 голосов
/ 23 мая 2012

В Ubuntu вы можете установить libtool, который автоматически разрешает библиотеки.

$ sudo apt-get install libtool

Это решило проблему с ltdl для меня, который был установлен как libltdl.so.7 и не был найден просто -lltdl в make.

4 голосов
/ 03 декабря 2008

Если я не ошибаюсь, libmagic или -lmagic - это не та же библиотека, что и ImageMagick. Вы заявляете, что хотите ImageMagick.

ImageMagick поставляется с утилитой для предоставления всех соответствующих опций компилятору.

Ex:

g++ program.cpp `Magick++-config --cppflags --cxxflags --ldflags --libs` -o "prog"
3 голосов
/ 17 мая 2016

Как упоминалось выше, компоновщик ищет libmagic.so, но у вас есть только libmagic.so.1.

Чтобы решить эту проблему, просто выполните обновление кеша.

ldconfig -v 

Для проверки вы можете запустить:

$ ldconfig -p | grep libmagic
1 голос
/ 02 июля 2014

Установка libgl1-mesa-dev из репозитория Ubuntu решила эту проблему для меня.

...