Ответ 1
Проблема заключается в том, что компоновщик ищет libmagic.so
, но у вас есть только libmagic.so.1
Быстрый взлом - это символическая ссылка libmagic.so.1
на libmagic.so
Я пытаюсь связать приложение с g++ в этой системе Debian lenny. ld жалуется, что не может найти указанные библиотеки. Конкретный пример здесь - ImageMagick, но у меня есть аналогичные проблемы и с несколькими другими библиотеками.
Я вызываю компоновщик с помощью:
g++ -w (..lots of .o files/include directories/etc..) \
-L/usr/lib -lmagic
ld жалуется:
/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
Как мне диагностировать эту проблему дальше, и что может быть неправильным? Я делаю что-то совершенно глупое?
Проблема заключается в том, что компоновщик ищет libmagic.so
, но у вас есть только libmagic.so.1
Быстрый взлом - это символическая ссылка libmagic.so.1
на libmagic.so
Как только что сформулировано grepsedawk, ответ лежит в опции -l
g++
, вызывая ld
. Если вы посмотрите на страницу руководства этой команды, вы можете:
g++ -l:libmagic.so.1 [...]
g++ -lmagic [...]
, если у вас есть символическая ссылка с именем libmagic.so в вашем пути к libsЭто соглашение 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, см. Diego E. Pettenò: компоновщики и имена.
Короче говоря, вы должны 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 поставляется с утилитой для предоставления всех соответствующих параметров компилятору.
Пример:
g++ program.cpp `Magick++-config --cppflags --cxxflags --ldflags --libs` -o "prog"
Как упоминалось выше, компоновщик ищет libmagic.so
, но у вас есть только libmagic.so.1
.
Чтобы решить эту проблему, просто выполните кеш обновления.
ldconfig -v
Чтобы проверить, что вы можете запустить:
$ ldconfig -p | grep libmagic
Установка libgl1-mesa-dev из репозитория Ubuntu разрешила эту проблему для меня.