>问题
我正在 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 0FUNC 全局默认值 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
000000000000000000A 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
注: 符号名称中有两个@
(@@
(。
我的困惑
- 是因为
libtiff.so.5
符号名称中@@
而不是@
导致链接错误吗libopencv_highgui.so.2.4.8:未定义对"TIFFIsTiled@LIBTIFF_4.0"的引用
- 符号名称中的
@
和@@
有什么区别? libtiff.so.5
中符号名称的后缀LIBTIFF_4.0
的含义是什么?- 很多人说这是因为OpenCV需要
libtiff4-dev
而Ubuntu 14.04没有提供。那么为什么 Ubuntu 的人在包服务器上放了一个损坏的包。 - 如何解决链接问题?
我不是编译和链接的职业。对不起这么长的帖子。只是提供足够的信息让你们帮助我。感谢任何建议。
附言如果您需要有关这些库的更多信息,请随时在评论中说。
我有类似的问题,这是由于蟒蛇搞砸了
我只需要执行以下命令:
conda remove libtiff
我通过以下方式安装了欧佩克:
sudo apt-get install opencv-dev
和自由蒂夫通过:
sudo apt-get install libtiff4-dev
老问题,但仍然没有答案,所以它在这里(我今天遇到了同样的错误(:
-
这不是链接器失败的原因。如果它能够找到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类型的东西(
希望对您有所帮助。
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 目录,事情进展顺利。