设想
我在从源代码构建最新版本的 OpenCV 贡献代码库时遇到了一些问题,但这个问题可能只是我缺乏更普遍的深度:
从官方仓库获取 4.5.4 标签,我使用符合以下要求的构建说明:有关使用其贡献代码库构建 OpenCV 的官方说明来自此处,而由于目前最新的 OpenCV 需要 libtiff 版本 4,我使用其中提到的 cmake 标志来构建 libtiff 版本 4 本身作为 OpenCV 构建的一部分 —— 这样 OpenCV 构建使用 libtiff 4 而不是默认的 Ubuntu 20.04 libtiff 版本 5 库和头文件。
尽管如此,在 OpenCV 构建的某个阶段,似乎有一个库无法找到 libtiff 版本 4 符号,即该库liblept
:
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/liblept.so.5: undefined reference to `TIFFReadDirectory@LIBTIFF_4.0'
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/liblept.so.5: undefined reference to `TIFFGetFieldDefaulted@LIBTIFF_4.0'
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/liblept.so.5: undefined reference to `TIFFCleanup@LIBTIFF_4.0'
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/liblept.so.5: undefined reference to `TIFFIsTiled@LIBTIFF_4.0'
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/liblept.so.5: undefined reference to `TIFFReadRGBAImageOriented@LIBTIFF_4.0'
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/liblept.so.5: undefined reference to `TIFFOpen@LIBTIFF_4.0'
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/liblept.so.5: undefined reference to `TIFFSetSubDirectory@LIBTIFF_4.0'
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/liblept.so.5: undefined reference to `TIFFSetField@LIBTIFF_4.0'
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/liblept.so.5: undefined reference to `TIFFCurrentDirOffset@LIBTIFF_4.0'
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/liblept.so.5: undefined reference to `TIFFWriteScanline@LIBTIFF_4.0'
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/liblept.so.5: undefined reference to `TIFFPrintDirectory@LIBTIFF_4.0'
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/liblept.so.5: undefined reference to `TIFFGetField@LIBTIFF_4.0'
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/liblept.so.5: undefined reference to `TIFFScanlineSize@LIBTIFF_4.0'
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/liblept.so.5: undefined reference to `TIFFSetWarningHandler@LIBTIFF_4.0'
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/liblept.so.5: undefined reference to `TIFFSetErrorHandler@LIBTIFF_4.0'
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/liblept.so.5: undefined reference to `TIFFSetDirectory@LIBTIFF_4.0'
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/liblept.so.5: undefined reference to `TIFFReadScanline@LIBTIFF_4.0'
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/liblept.so.5: undefined reference to `TIFFClose@LIBTIFF_4.0'
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/liblept.so.5: undefined reference to `TIFFClientOpen@LIBTIFF_4.0'
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/liblept.so.5: undefined reference to `TIFFGetVersion@LIBTIFF_4.0'
我获得了该库的以下输出 ―
$ ldd /usr/lib/x86_64-linux-gnu/liblept.so.5
.
.
.
libtiff.so.5 => /usr/lib/x86_64-linux-gnu/libtiff.so.5 (0x00007f40034c6000)
我确实安装了 libtiff5:
$ apt list libtiff*
libtiff-dev/focal-updates,focal-security,now 4.1.0+git191117-2ubuntu0.20.04.2 amd64
libtiff-dev/focal-updates,focal-security 4.1.0+git191117-2ubuntu0.20.04.2 i386
libtiff-doc/focal-updates,focal-updates,focal-security,focal-security 4.1.0+git191117-2ubuntu0.20.04.2 all
libtiff-opengl/focal-updates,focal-security 4.1.0+git191117-2ubuntu0.20.04.2 amd64
libtiff-opengl/focal-updates,focal-security 4.1.0+git191117-2ubuntu0.20.04.2 i386
libtiff-tools/focal-updates,focal-security 4.1.0+git191117-2ubuntu0.20.04.2 amd64
libtiff-tools/focal-updates,focal-security 4.1.0+git191117-2ubuntu0.20.04.2 i386
libtiff5-dev/focal-updates,focal-security 4.1.0+git191117-2ubuntu0.20.04.2 amd64
libtiff5-dev/focal-updates,focal-security 4.1.0+git191117-2ubuntu0.20.04.2 i386
libtiff5/focal-updates,focal-security,now 4.1.0+git191117-2ubuntu0.20.04.2 amd64 [installed]
libtiff5/focal-updates,focal-security 4.1.0+git191117-2ubuntu0.20.04.2 i386
libtiffxx5/focal-updates,focal-security,now 4.1.0+git191117-2ubuntu0.20.04.2 amd64 [installed,automatic]
libtiffxx5/focal-updates,focal-security 4.1.0+git191117-2ubuntu0.20.04.2 i386
看着这里,我只是对显示 libtiff5 的版本要求为 4.8.3 的表格感到有些困惑。
问题
这是否意味着我的系统上的构建在尝试解析这些 libtiff4 符号时(就命令ldd
可能暗示而言)尝试将 liblept5 与 libtiff5 链接?还是它试图动态解析它们,因此解析失败,因为我的系统没有全局可供链接器使用的 libtiff4?
更多版本信息
- Ubuntu 20.04
- cmake 3.16.3
- GNU Make 4.2.1
- gcc 9.3.0
答案1
在 Ubuntu 20.04 上使用 OpenCV 4.2.0 时不会重现此问题。上面的问题不会在那里发生。您还需要经常记住使用 ―
sudo ldconfig
安装库之后,如果您希望针对它们进行构建。
话虽如此,我想知道是否可以解决我的问题的最后一个疑问条款,以便在问题所描述的背景下促进更细致的理解。