Ошибка связи с `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 install libopencv-dev

Скомпилируйте Caffe с помощью CMake 2.8.

Ошибка связи:

Связывание исполняемого cXX CXX -

/usr/lib/x86_64-linux-gnu/libopencv_highgui.so.2.4.8: undefined ссылка на `[email protected]_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 FUNC GLOBAL DEFAULT UND [email protected]_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: undefined ссылка на '[email protected]_4.0'

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

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

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

Ответ 1

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

sudo apt-get install libtiff4-dev

Ответ 2

Это то, что сработало для меня: Перейдите на веб-сайт Tiff и следуйте инструкциям по загрузке Tiff и его созданию и установите его. Затем в вашем файле make добавьте следующее:

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

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

sudo find /usr/ -name libtiff.so

Ответ 3

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

  • Это не значит, что компоновщик терпит неудачу. Если бы он смог найти 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. so.5, если вы не указали это явно).

  • а. Вы можете протестировать 4., вызывая командную строку компоновщика самостоятельно из командной строки. Если вы собрали caffe с cmake, вы найдете команду компоновщика под инструментами /CMakeFiles/caffe.bin.dir/link.txt. Просто добавьте /usr/lib/x 86_64-linux-gnu/libtiff.so.5 в командную строку, и он должен работать.

    б. Альтернативно вручную создайте символическую ссылку /usr/lib/x 86_64-linux-gnu/libtiff.so

    с. установите пакет dev, который должен сделать это для вас. Также убедитесь, что cmake знает о /usr/lib/x 86_64-linux-gnu/, указав дополнительный путь к библиотеке

    д. убедитесь, что в вашей системе нет другой библиотеки libtiff.so, если предыдущие действия не работают (например, тип anconda)

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

Ответ 4

У меня были похожие проблемы, и это произошло из-за того, что Anaconda испортила

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

conda remove libtiff

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

sudo apt-get install opencv-dev

и libtiff через:

sudo apt-get install libtiff4-dev

Ответ 5

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

62: 0000000000000000 0 FUNC GLOBAL DEFAULT UND [email protected]_4.0 (9)

есть a UND, который, я думаю, означает undefined. Я думаю, когда ubuntu создает libopencv_highgui, он не может найти [email protected] 4.0. Поэтому я думаю, что я должен иметь libtiff под рукой и снова компилировать libopencv_xxx.

Мне нравится включать вещи в конду. Поэтому я снова устанавливаю opencv с conda и указываю my LIBRARY_PATH на каталог conda lib, и все идет хорошо.