"dpkg-shlibdeps: error: 找不到依赖信息"

51

我正在编译一个Deb包,当我运行dpkg-buildpackage时,我得到以下错误:

dpkg-shlibdeps: error: no dependency information found for /usr/local/lib/libopencv_highgui.so.2.3 

    ...
    make: *** [binary-arch] Error 2
这是因为我手动安装了依赖项。我知道如果我安装依赖项(或使用checkinstall),问题将得到解决,但我仍想生成软件包,因为我不想进行依赖项检查。我知道可以向dpkg-shlibdeps提供选项--ignore-missing-info,以防找不到依赖信息时出现错误。但是由于我正在使用dpkg-buildpackage,而dpkg-buildpackage又调用dpkg-shlibdeps,所以我不知道该如何将此选项传递给dpkg-shlibdeps...

我已经尝试过:

sudo dpkg-buildpackage -rfakeroot -d -B

还有:

export DEB_DH_MAKESHLIBS_ARG=--ignore-missing-info

作为超级用户。

有任何想法吗?

8个回答

64

使用:

override_dh_shlibdeps:
    dh_shlibdeps --dpkg-shlibdeps-params=--ignore-missing-info

如果你的规则文件中没有dh_shlibdeps调用,那通常是你还没有

%:
    dh $@

在其中唯一的规则是...在上面你必须在dh_shlibdeps前使用制表符而不是空格


17

如果您希望它忽略该标志,请将debian/rules行更改为:

dh_shlibdeps

至:

dh_shlibdeps --dpkg-shlibdeps-params=--ignore-missing-info

4
如果debian/rules文件中没有包含那一行,该怎么办? - knocte
一些代码行肯定触发了那个消息,这意味着一定有某个规则在调用dpkg-shlibdeps。如果不是dh_shlibdeps包装脚本,那么它是什么? - Wes Hardaker
在CPack的情况下,不存在debian/rules文件。 - Stéphane
CPack可以自动产生debian/rules文件,并且如果dpkg-shlibdeps支持,它会包含选项--ignore-missing-info。 自版本3.20起,CPack还支持dpkg-shlibdeps-l选项,该选项可以通过变量CPACK_DEBIAN_PACKAGE_SHLIBDEPS_PRIVATE_DIRS设置。 - dvo

15

不需要修改构建脚本,只需创建一个文件,就可以采用另一种方式。

通过创建格式为library-name soname-version dependenciesdebian/shlibs.local 文件,您可以指定本地shlib覆盖

例如,给定以下(精简后的)ldd /path/to/binary 输出:

libevent-2.0.so.5 => /usr/lib/libevent-2.0.so.5 (0x00007fc9e47aa000)
libgcrypt.so.20 => /usr/lib/libgcrypt.so.20 (0x00007fc9e4161000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007fc9e3b1a000)

debian/shlibs.local的内容如下:

libevent-2.0 5 libevent-2.0
libgcrypt 20 libgcrypt
libpthread 0 libpthread

"依赖项"列表(第三列)不需要100%准确 - 我只是再次使用库名称本身。

当然,在一个正常的Debian系统中,这些内容已经在/var/lib/dpkg/info中定义好了(可以用作这些覆盖的灵感)。但我的Debian系统不是正常的。


那很接近但却毫无用处,如果你依赖于导致构建中断的库(另外以你这种方式,它还会产生循环依赖)。如果我将依赖名称更改为现有库,它对我有效。在我的程序包中,我使用了:libnvbuf_utils 1.0.0 libgcc1,现在我已经成功构建了程序包。如果你编译可执行文件,则 libgcc1 是必需的。正如你所提到的,你可以通过 ldd 查看库列表,以便从中选择任何一个。你也可以使用 objdump -x ... 检查你遇到问题的库以查看其依赖项。 - Alexis Wilke

9

3
如果你正在构建的软件包提供私有共享库,更好的方法是使用dpkg-shlibdeps命令的-ldirectory选项,详见https://manpages.debian.org/testing/dpkg-dev/dpkg-shlibdeps.1.en.html。 - Piotr Dobrogost

4

您刚刚拼错了导出的命令。正确的命令应该是:

export DEB_DH_SHLIBDEPS_ARGS_ALL=--dpkg-shlibdeps-params=--ignore-missing-info

3

dpkg-buildpackage使用make来处理debian/rules。在这个过程中,dpkg-buildpackage可能会调用dpkg-shlibdeps。

因此,更改软件包构建过程的正确方法是编辑debian/rules。 如果没有看到实际的debian/rules,很难给出更多提示。


-1
你可以使用这个:
dh_makeshlibs -a -n

在dh_install之后


-2

最终我用了一种粗暴的方式解决了这个问题:

我编辑了脚本 /usr/bin/dpkg-shlibdeps,将其改为:

my $ignore_missing_info = 0;

my $ignore_missing_info = 1;

12
这个想法似乎非常危险。如果你想要替换二进制文件,至少应该尝试把替代品放到 /usr/local/ 目录下。 - umläute
哎呀!是的……不要那样做。这不是一个好的解决方案。@dequis提供了你想使用的非常好的解决方案,但他提出的依赖关系不会起作用(即依赖于自己是不好的,但由于这是需要正确定义的库,它仍然是错误的。我放了一个评论,说明我所做的事情,现在它像魔法一样运行。) - Alexis Wilke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接