2008-12-03 3 views
150

Я пытаюсь связать приложение с g ++ в этой системе lenny Debian. ld жалуется, что не может найти указанные библиотеки. Конкретный пример здесь - ImageMagick, но у меня есть аналогичные проблемы и с несколькими другими библиотеками.ld не удается найти существующую библиотеку

Я зову линкер с:

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 

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

ответ

138

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

Быстрый хак для симлинки libmagic.so.1 в libmagic.so

+3

, который работает, я вроде недоумевали, что бы имя файла в совершенно бесполезный путь по умолчанию - вы можете предоставить какие-либо понять, почему это будет делать это по умолчанию? – maxpenguin 2008-12-03 01:09:50

+0

Скорее всего, это неправильная настройка скрипта установки. – grepsedawk 2008-12-03 01:15:38

+5

foo.so.1 также является символической ссылкой на foo.so.1.0.0. Таким образом, у вас может быть несколько версий библиотеки в вашей системе, и если приложение нуждается в определенном, оно может ссылаться на него, в то время как в целом, новый выбирается symlink. Я не знаю, почему эта символическая ссылка отсутствовала. – Svante 2008-12-03 01:19:21

4

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

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

Ex:

g++ program.cpp `Magick++-config --cppflags --cxxflags --ldflags --libs` -o "prog" 
57

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

  • g++ -l:libmagic.so.1 [...]
  • или: g++ -lmagic [...], если у вас есть символическая ссылка с именем libmagic.so в вашем ЛИЭС пути
30

It это соглашение 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ò: Linkers and names для получения подробной информации о том, как все это работает в Linux.


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

6

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

$ sudo apt-get install libtool 

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

1

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

2

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

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

ldconfig -v 

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

$ ldconfig -p | grep libmagic 
Смежные вопросы