在 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
注意:符号名称中有两个@
(@@
).
我的困惑
- 是否因为
libtiff.so.5
在符号名称中有 @@
而不是 @
导致链接错误
libopencv_highgui.so.2.4.8: undefined reference to 'TIFFIsTiled@LIBTIFF_4.0'
- What's the difference between
@
and @@
in symbol names?
- What's the meaning of the suffix
LIBTIFF_4.0
of symbols names in libtiff.so.5
?
- 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.
- 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
老问题,但仍然没有答案所以就这样吧(我今天遇到了同样的错误):
这不是 linker 失败的原因。如果它能够找到 libtiff.so.5,它就会 linked 就好了。
@ vs @@ 只是一种跟踪函数不同版本的方法。此处有更多详细信息 https://sourceware.org/binutils/docs/ld/VERSION.html
LIBTIFF_4.0 表示动态加载符号时需要特定版本的 TIFFOpen。
这可能是解决问题的好方法。如果没有 libtiff-dev 包,libtiff.so 符号 linked 文件可能不会在 /usr/lib/x86_64-linux-gnu/ 中退出,因此 linker 将无法找到该库(除非您明确告诉它,否则它对 libtiff.so.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 类型的东西)
,请检查系统中是否潜伏着其他 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 目录,一切顺利。
问题
我正在 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
注意:符号名称中有两个@
(@@
).
我的困惑
- 是否因为
libtiff.so.5
在符号名称中有@@
而不是@
导致链接错误libopencv_highgui.so.2.4.8: undefined reference to 'TIFFIsTiled@LIBTIFF_4.0'
- What's the difference between
@
and@@
in symbol names? - What's the meaning of the suffix
LIBTIFF_4.0
of symbols names inlibtiff.so.5
? - 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. - 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
老问题,但仍然没有答案所以就这样吧(我今天遇到了同样的错误):
这不是 linker 失败的原因。如果它能够找到 libtiff.so.5,它就会 linked 就好了。
@ vs @@ 只是一种跟踪函数不同版本的方法。此处有更多详细信息 https://sourceware.org/binutils/docs/ld/VERSION.html
LIBTIFF_4.0 表示动态加载符号时需要特定版本的 TIFFOpen。
这可能是解决问题的好方法。如果没有 libtiff-dev 包,libtiff.so 符号 linked 文件可能不会在 /usr/lib/x86_64-linux-gnu/ 中退出,因此 linker 将无法找到该库(除非您明确告诉它,否则它对 libtiff.so.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 类型的东西)
,请检查系统中是否潜伏着其他 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 目录,一切顺利。