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

提问人:nn0p 提问时间:3/26/2015 最后编辑:nn0p 更新时间:8/31/2017 访问量:8719

问:

问题

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

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

sudo apt-get 安装 libopencv-dev

使用 CMake 2.8 进行编译。Caffe

链接错误:

链接 CXX 可执行文件 caffe-

/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: 00000000000000000 0 FUNC GLOBAL DEFAULT UND TIFFOpen@LIBTIFF_4.0 (9)

注意:符号名称中有一个单数。@

$ nm -D libopencv_highgui.so.2.4.8|grep TIFF字体

U TIFF笔

libtiff.so.5 的导出符号:

$ nm -D /usr/lib/x86_64-linux-gnu/libtiff.so.5

0000000000000000 安LIBTIFF_4.0

...

000000000000429f0 T TIFF笔

...

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

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

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

我的困惑

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

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

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


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

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

C++ opencv elf 动态链接 unresolved-external

评论

0赞 The Vivandiere 3/26/2015
太长了,你能让你的帖子简洁吗?
0赞 nn0p 3/26/2015
现在它更简洁了。@Golazo
0赞 Josh 7/15/2015
你最终解决了这个问题吗?如果是这样,您能否描述一下解决方案。谢谢!
0赞 mrgloom 1/19/2016
也许软件包不是使用 TIFF 库构建的,无论如何您都可以从源代码构建 OpenCV。libopencv-dev

答:

2赞 simurg 3/26/2015 #1

安装 libtiff4-dev:

sudo apt-get install libtiff4-dev

评论

1赞 nn0p 3/26/2015
实际上,我尝试安装版本 4。但这并没有解决问题。要查找的库是 。顺便说一句,Ubuntu 14.04 不提供 libtiff4。libtiff4-dev 文件。除非,我自己编译 OpenCV。libopencv_highgui.so.2.4.8libtiff.so.5
1赞 Samer 10/7/2016 #2

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

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

如果您想知道通往 libtiff.so 的路径 试试这个:

sudo find /usr/ -name libtiff.so
3赞 PoorBear 10/27/2016 #3

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

  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 类型的东西)

希望它有所帮助。

4赞 Kev1n91 6/15/2017 #4

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

我只需要执行以下命令:

conda remove libtiff

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

sudo apt-get install opencv-dev

和 libtiff 通过:

sudo apt-get install libtiff4-dev
0赞 sunhs 8/31/2017 #5

正如你所看到的

62: 0000000000000000 0 FUNC GLOBAL DEFAULT UND TIFFOpen@LIBTIFF_4.0 (9)

我认为这意味着.我猜当 ubuntu 正在生产时,它找不到.所以我想我应该手头有并再次编译。UNDundefinedlibopencv_highguiTIFFOpen@LIBTIFF 4.0libtifflibopencv_xxx

我喜欢在 conda 中包含一些东西。所以我用 conda 再次安装 opencv,并将我的指向 conda lib 目录,一切顺利。LIBRARY_PATH