提问人:nn0p 提问时间:3/26/2015 最后编辑:nn0p 更新时间:8/31/2017 访问量:8719
在 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() 是从 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
注意:符号名称中有两个 ()。@
@@
我的困惑
- 是因为符号名称中有,而不是因为导致了链接错误
libtiff.so.5
@@
@
libopencv_highgui.so.2.4.8:对“TIFFIsTiled@LIBTIFF_4.0”的未定义引用
- 符号名称之间有什么区别?
@
@@
- 符号名称的后缀是什么意思?
LIBTIFF_4.0
libtiff.so.5
- 很多人说这是因为 Ubuntu 14.04 没有提供的 OpenCV 需求。那么为什么 Ubuntu 的人在包服务器上放了一个损坏的包。
libtiff4-dev
- 如何解决链接问题?
我不是编译和链接的职业。对不起这么长的帖子。只是为你们提供足够的信息来帮助我。 感谢您的任何建议。
附言如果您需要有关这些库的更多信息,请随时在评论中说。
答:
安装 libtiff4-dev:
sudo apt-get install libtiff4-dev
评论
libopencv_highgui.so.2.4.8
libtiff.so.5
这对我有用: 转到 Tiff 网站,按照说明下载 Tiff 并构建它,然后安装它。然后在您的 make 文件中添加以下内容:
-L/[path to libtiff.so] -ltiff
如果您想知道通往 libtiff.so 的路径 试试这个:
sudo find /usr/ -name libtiff.so
老问题但仍然没有答案,所以它就在这里(我今天遇到了同样的错误):
这不是链接器失败的原因。如果它能够找到 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.通过从命令行自行调用链接器命令行。如果您使用 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 类型的东西)
希望它有所帮助。
我遇到了类似的问题,这是由于 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)
我认为这意味着.我猜当 ubuntu 正在生产时,它找不到.所以我想我应该手头有并再次编译。UND
undefined
libopencv_highgui
TIFFOpen@LIBTIFF 4.0
libtiff
libopencv_xxx
我喜欢在 conda 中包含一些东西。所以我用 conda 再次安装 opencv,并将我的指向 conda lib 目录,一切顺利。LIBRARY_PATH
评论
libopencv-dev