在Ubuntu 14.04下链接错误与`libopencv_highgui.so`,与`libtiff.so.5的奇怪结果

nn0*_*n0p 12 c++ opencv elf dynamic-linking unresolved-external

问题

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

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

sudo apt-get install 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 FUNC GLOBAL DEFAULT UND TIFFOpen@LIBTIFF_4.0(9)

注意:@符号名称中只有一个.

$ nm -D libopencv_highgui.so.2.4.8 | grep TIFFOpen

你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-devUbuntu 14.04不提供.那么为什么Ubuntu家伙在包服务器上放了一个破损的包.
  5. 如何解决链接问题?


我不是编译和链接的专业.对不起这么长的帖子.什么为你们提供足够的信息来帮助我.感谢任何建议.

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

小智 3

老问题,但仍然没有答案,所以就这样(我今天遇到了同样的错误):

  1. 这不是链接器失败的原因。如果它能够找到 libtiff.so.5,它就会很好地链接。

  2. @ 与 @@ 只是跟踪函数不同版本的一种方法。更多详细信息请参见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. A。您可以通过从命令行自行调用链接器命令行来测试 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。安装开发包,它应该可以为你做到这一点。还要确保 cmake 通过指定额外的库路径了解 /usr/lib/x86_64-linux-gnu/

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

希望能帮助到你。