在 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`

问题

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

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

sudo apt-get install libopencv-dev

使用 CMake 2.8 编译 Caffe

链接错误:

Linking CXX executable caffe-

/usr/lib/x86_64-linux-gnu/libopencv_highgui.so.2.4.8: undefined reference to `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

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: undefined reference to 'TIFFIsTiled@LIBTIFF_4.0'

  2. What's the difference between @ and @@ in symbol names?
  3. What's the meaning of the suffix LIBTIFF_4.0 of symbols names in libtiff.so.5?
  4. Many people said it's because OpenCV need libtiff4-dev which is not provided by Ubuntu 14.04. Then why the Ubuntu guys put a broken package on the package server.
  5. How to solve the linking problem?


我不是编译和链接专业的。很抱歉这么长post。只是为你们提供足够的信息来帮助我。 感谢您的任何建议。

P.S. 如果您需要这些库的更多信息,请随时在评论中说出来。

安装 libtiff4-dev:

sudo apt-get install libtiff4-dev

这对我有用: 转到 Tiff website,然后按照说明下载 Tiff 并构建它,然后安装它。然后在你的 make 文件中添加:

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

如果你想知道libtiff.so的路径 试试这个:

sudo find /usr/ -name libtiff.so

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

  1. 这不是 linker 失败的原因。如果它能够找到 libtiff.so.5,它就会 linked 就好了。

  2. @ vs @@ 只是一种跟踪函数不同版本的方法。此处有更多详细信息 https://sourceware.org/binutils/docs/ld/VERSION.html

  3. LIBTIFF_4.0 表示动态加载符号时需要特定版本的 TIFFOpen。​​

  4. 这可能是解决问题的好方法。如果没有 libtiff-dev 包,libtiff.so 符号 linked 文件可能不会在 /usr/lib/x86_64-linux-gnu/ 中退出,因此 linker 将无法找到该库(除非您明确告诉它,否则它对 libtiff.so.5 一无所知)。

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

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

    c。安装开发包,它应该为你做。还要确保 cmake 通过指定额外的库路径

    了解 /usr/lib/x86_64-linux-gnu/

    d。如果前面的步骤不起作用(例如 anconda 类型的东西)

  6. ,请检查系统中是否潜伏着其他 libtiff.so 库

希望对您有所帮助。

我遇到了类似的问题,这是由于 Anaconda 搞砸了

我只需执行以下命令:

conda remove libtiff

我通过以下方式安装了 opecv:

sudo apt-get install opencv-dev

和 libtiff 通过:

sudo apt-get install libtiff4-dev

如您所见

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 中包含一些东西。所以我再次使用 conda 安装 opencv,并将我的 LIBRARY_PATH 指向 conda lib 目录,一切顺利。