Я не могу найти существующую библиотеку

169

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

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

maxpenguin
источник

Ответы:

158

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

Быстрый взлом это ссылка libmagic.so.1наlibmagic.so

grepsedawk
источник
3
это работает, я несколько озадачен тем, что он по умолчанию назвал бы файл совершенно бесполезным способом - можете ли вы дать какое-либо представление, почему он будет делать это по умолчанию?
maxpenguin
5
Foo.so.1 также является символической ссылкой на foo.so.1.0.0. Таким образом, вы можете иметь несколько версий библиотеки в вашей системе, и если приложению нужна конкретная библиотека, она может ссылаться на нее, в то время как в общем случае самая новая выбирается с помощью символической ссылки. Я не знаю, почему эта символическая ссылка отсутствовала.
Сванте
46
libmagic.so.1 - сонама, используемая динамическим компоновщиком; libmagic.so используется компоновщиком и обычно вместе с заголовками в пакете -dev. Символьная ссылка может отсутствовать, потому что пакет -dev не был установлен.
CesarB
13
У меня была та же проблема ... вместо того, чтобы делать "взлом", я установил версию "* -devel", и она исправила компиляцию.
Тревор Бойд Смит
4
Как сделать ссылку на libmagic.so.1 на libmagic.so? И где найти эти пакеты "devel"
Black
69

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

  • g++ -l:libmagic.so.1 [...]
  • или:, g++ -lmagic [...]если у вас есть символическая ссылка с именем libmagic.so в пути libs
Петр Лесницкий
источник
Или в итоге, удалите libпрефикс при ссылке на него при использовании -l. -llibmagicдолжно быть -lmagic.
Phyatt
31

По соглашению 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.

ephemient
источник
7

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

$ sudo apt-get install libtool

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

Мистер Эд
источник
это не решило ошибку не может нормально -LGL . Не могли бы вы дать больше информации о том, что делает libtool и как он решает проблемы с библиотеками?
Шахряр Салюхи
4

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

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

Пример:

g++ program.cpp `Magick++-config --cppflags --cxxflags --ldflags --libs` -o "prog"
Брайан Джанфоркаро
источник
4

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

Для решения этой проблемы просто выполните обновление кеша.

ldconfig -v 

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

$ ldconfig -p | grep libmagic
Мигель Игнасио Иглесиас
источник
1

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

kirenpillay
источник
5
Конечно, вы не страдаете от той же ошибки скрипта, что и maxpenguin в 2008 году.
Sophit
это решило мою проблему. Не могли бы вы дать больше информации о том, что это такое. и как это решает эту проблему? (я имею в виду: libgl1-mesa-dev). спасибо
Шахряр Салюхи