在 Ubuntu 14.04 下将错误与“libopencv_highgui.so”链接,与“libtiff.so.5”

Linking error with `libopencv_highgui.so` under Ubuntu 14.04, strange result with `libtiff.so.5`

本文关键字:so Ubuntu 链接 libtiff highgui 错误 libopencv      更新时间:2023-10-16

>问题

我正在 Ubuntu 14.04(64 位(中编译深度学习库 Caffe。

OpenCV(Version: 2.4.8+dfsg1-2ubuntu1(是从ubuntu软件包服务器安装的:

sudo apt-get install libopencv-dev

使用 CMake 2.8 编译Caffe

链接错误:

链接 CXX 可执行咖啡-

/

usr/lib/x86_64-linux-gnu/libopencv_highgui.so.2.4.8:对"TIFFOpen@LIBTIFF_4.0"的未定义引用

信息化

似乎没有找到TIFF库的一些符号。我做了一些努力来找到原因(没有运气(。以下是有关库的一些信息。

libopencv_highgui.so.2.4.8链接的TIFF库

$ 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 全局默认值 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

000000000000000000

A LIBTIFF_4.0

00000000000429f0 T TIFFOpen

$ readelf -s/usr/lib/x86_64-linux-gnu/libtiff.so.5|grep TIFFOpen

99: 00000000000429f0 239 FUNC 全局默认值 12 TIFFOpen@@LIBTIFF_4.0

: 符号名称中有两个@(@@(。

我的困惑

  1. 是因为libtiff.so.5符号名称中@@而不是@导致链接错误吗

    libopencv_highgui.so.2.4.8:未定义对"TIFFIsTiled@LIBTIFF_4.0"的引用

  2. 符号名称中的@@@有什么区别?
  3. libtiff.so.5中符号名称的后缀LIBTIFF_4.0的含义是什么?
  4. 很多人说这是因为OpenCV需要libtiff4-dev而Ubuntu 14.04没有提供。那么为什么 Ubuntu 的人在包服务器上放了一个损坏的包。
  5. 如何解决链接问题?

我不是编译和链接的职业。对不起这么长的帖子。只是提供足够的信息让你们帮助我。感谢任何建议。

附言如果您需要有关这些库的更多信息,请随时在评论中说。

我有类似的问题,这是由于蟒蛇搞砸了

我只需要执行以下命令:

conda remove libtiff

我通过以下方式安装了欧佩克:

sudo apt-get install opencv-dev

和自由蒂夫通过:

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.so.5 一无所知,除非您明确告诉它(。

  5. 一个。您也许可以测试 4。通过从命令行自行调用链接器命令行。如果你用cmake编译了caffe,你可以在tools/CMakeFiles/caffe.bin.dir/link.txt下找到链接器命令。只需将/usr/lib/x86_64-linux-gnu/libtiff.so.5 添加到命令行,它就可以工作了。

    b. 或者手动创建符号链接/usr/lib/x86_64-linux-gnu/libtiff.so

    c. 安装 dev 包,它应该会为你执行此操作。还要确保 cmake 知道/usr/lib/x86_64-linux-gnu/通过指定额外的库路径

    D.检查您的系统中是否潜伏着其他 libtiff.so 库,如果前面的步骤不起作用(例如Anconda类型的东西(

希望对您有所帮助。

install libtiff4-dev:

sudo apt-get install libtiff4-dev

这是对我有用的:转到 Tiff 网站,按照说明下载 Tiff 并构建它,然后安装它。然后在您的制作文件中添加以下内容:

-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

我喜欢在康达中包含东西。所以我用 conda 再次安装 opencv,并将我的LIBRARY_PATH指向 conda lib 目录,事情进展顺利。