Ошибка связывания с `libopencv_highgui.so` под Ubuntu 14.04, странный результат с`libtiff.so.5`
проблема
Я собираю библиотеку глубокого обучения Caffe в Ubuntu 14.04(64 бит).
OpenCV (Version: 2.4.8+dfsg1-2ubuntu1
) устанавливается с сервера пакетов Ubuntu с:
sudo apt-get установить libopencv-dev
компилировать Caffe
с CMake 2.8.
Ошибка связи:
Связывание исполняемого файла CXX
/usr/lib/x86_64-linux-gnu/libopencv_highgui.so.2.4.8: неопределенная ссылка на `TIFFOpen@LIBTIFF_4.0'
детали
Кажется, некоторые символы библиотеки TIFF не найдены. Я приложил некоторые усилия, чтобы найти причину (без удачи). Вот некоторая информация о библиотеках.
Библиотека TIFF, связанная libopencv_highgui.so.2.4.8
$ ldd libopencv_highgui.so.2.4.8 | Grep Tiff
libtiff.so.5 => /usr/lib/x86_64-linux-gnu/libtiff.so.5 (0x00007f978313b000)
Импорт символов libopencv_highgui.so.2.4.8
$ readelf -s libopencv_highgui.so.2.4.8 | grep TIFFOpen
62: 0000000000000000 0 ФУНКЦИОНАЛЬНЫЙ ГЛОБАЛЬНЫЙ ПО УМОЛЧАНИЮ UND TIFFOpen@LIBTIFF_4.0 (9)
Примечание: есть один @
в именах символов.
$ nm -D libopencv_highgui.so.2.4.8 | grep TIFFOpen
U TIFFOpen
Экспорт символов libtiff.so.5
:
$ nm -D /usr/lib/x86_64-linux-gnu/libtiff.so.5
0000000000000000 A LIBTIFF_4.0
...
00000000000429f0 T TIFFOpen
...
$ readelf -s /usr/lib/x86_64-linux-gnu/libtiff.so.5|grep TIFFOpen
99: 00000000000429f0 239 FUNC GLOBAL DEFAULT 12 TIFFOpen @@ LIBTIFF_4.0
Примечание: есть два @
(@@
) в именах символов.
Моя путаница
- Это потому что
libtiff.so.5
имеет@@
в именах символов вместо@
это сделало ошибку связыванияlibopencv_highgui.so.2.4.8: неопределенная ссылка на 'TIFFIsTiled@LIBTIFF_4.0'
- В чем разница между
@
а также@@
в именах символов? - Что означает суффикс
LIBTIFF_4.0
имен символов вlibtiff.so.5
? - Многие люди говорят, что это потому, что нужно OpenCV
libtiff4-dev
который не предоставляется Ubuntu 14.04. Тогда почему ребята из Ubuntu поставили сломанный пакет на сервер пакетов. - Как решить проблему с ссылками?
Я не профессия по компиляции и компоновке. Извините за такой длинный пост. Просто, чтобы предоставить достаточно информации для вас, ребята, чтобы помочь мне. Ценю любые предложения.
PS Если вам нужна дополнительная информация об этих библиотеках, не стесняйтесь говорить в комментарии.
5 ответов
У меня были похожие проблемы, и это было из-за испорченной Анаконды
Мне просто нужно было выполнить следующую команду:
conda remove libtiff
Я установил opecv через:
sudo apt-get install opencv-dev
и libtiff через:
sudo apt-get install libtiff4-dev
Старый вопрос, но все еще без ответа, так что вот оно (сегодня я столкнулся с той же ошибкой):
Это не то, почему компоновщик не работает. Если бы он смог найти libtiff.so.5, он бы просто связался.
@ vs @@ - это просто способ отслеживания разностных версий функции. Более подробно здесь https://sourceware.org/binutils/docs/ld/VERSION.html
LIBTIFF_4.0 означает, что это та конкретная версия TIFFOpen, которая требуется при динамической загрузке символа.
Это, вероятно, хороший способ решить проблему. Вероятно, что без пакета libtiff-dev символический связанный файл libtiff.so не завершится в /usr/lib/x86_64-linux-gnu/, поэтому компоновщик не сможет найти библиотеку (он ничего не знает о libtiff. т.5, если вы не укажете это явно).
а. Вы можете проверить 4., вызвав командную строку компоновщика самостоятельно из командной строки. Если вы скомпилировали caffe с помощью cmake, вы найдете команду компоновщика в tools/CMakeFiles/caffe.bin.dir/link.txt. Просто добавьте /usr/lib/x86_64-linux-gnu/libtiff.so.5 в командную строку, и это должно работать.
б. Или вручную создайте символическую ссылку /usr/lib/x86_64-linux-gnu/libtiff.so
с. установите пакет dev, который должен сделать это за вас. Также убедитесь, что cmake знает о /usr/lib/x86_64-linux-gnu/, указав дополнительный путь к библиотеке
д. убедитесь, что в вашей системе нет других библиотек libtiff.so, если предыдущие шаги не работают (например, вещь типа anconda)
Надеюсь, поможет.
Как вы можете видеть в
62: 0000000000000000 0 FUNC GLOBAL DEFAULT UND TIFFOpen@LIBTIFF_4.0 (9)
есть UND
что я думаю означает undefined
, Я думаю, когда Ubuntu производит libopencv_highgui
не может найти TIFFOpen@LIBTIFF 4.0
, Так что я думаю, что должен был libtiff
под рукой и собрать libopencv_xxx
снова.
Мне нравится включать вещи в Конде. Поэтому я снова устанавливаю opencv с помощью conda и указываю LIBRARY_PATH
в каталог conda lib и все идет хорошо.