Ошибка связывания с `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

Примечание: есть два @ (@@) в именах символов.

Моя путаница

  1. Это потому что libtiff.so.5 имеет @@ в именах символов вместо @ это сделало ошибку связывания

    libopencv_highgui.so.2.4.8: неопределенная ссылка на 'TIFFIsTiled@LIBTIFF_4.0'

  2. В чем разница между @ а также @@ в именах символов?
  3. Что означает суффикс LIBTIFF_4.0 имен символов в libtiff.so.5?
  4. Многие люди говорят, что это потому, что нужно OpenCV libtiff4-dev который не предоставляется Ubuntu 14.04. Тогда почему ребята из Ubuntu поставили сломанный пакет на сервер пакетов.
  5. Как решить проблему с ссылками?


Я не профессия по компиляции и компоновке. Извините за такой длинный пост. Просто, чтобы предоставить достаточно информации для вас, ребята, чтобы помочь мне. Ценю любые предложения.

PS Если вам нужна дополнительная информация об этих библиотеках, не стесняйтесь говорить в комментарии.

5 ответов

У меня были похожие проблемы, и это было из-за испорченной Анаконды

Мне просто нужно было выполнить следующую команду:

conda remove libtiff

Я установил opecv через:

sudo apt-get install opencv-dev

и libtiff через:

sudo apt-get install libtiff4-dev

Старый вопрос, но все еще без ответа, так что вот оно (сегодня я столкнулся с той же ошибкой):

  1. Это не то, почему компоновщик не работает. Если бы он смог найти libtiff.so.5, он бы просто связался.

  2. @ vs @@ - это просто способ отслеживания разностных версий функции. Более подробно здесь https://sourceware.org/binutils/docs/ld/VERSION.html

  3. LIBTIFF_4.0 означает, что это та конкретная версия TIFFOpen, которая требуется при динамической загрузке символа.

  4. Это, вероятно, хороший способ решить проблему. Вероятно, что без пакета libtiff-dev символический связанный файл libtiff.so не завершится в /usr/lib/x86_64-linux-gnu/, поэтому компоновщик не сможет найти библиотеку (он ничего не знает о libtiff. т.5, если вы не укажете это явно).

  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)

Надеюсь, поможет.

Установите libtiff4-dev:

sudo apt-get install libtiff4-dev

Вот что сработало для меня: зайдите на сайт Tiff и следуйте инструкциям, чтобы загрузить Tiff, собрать и установить его. Затем в вашем файле make добавьте это:

-L/[path to libtiff.so] -ltiff

Если вы хотите узнать путь к libtiff.so, попробуйте это:

sudo find /usr/ -name libtiff.so

Как вы можете видеть в

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 и все идет хорошо.

Другие вопросы по тегам