dpkg-shlibdeps: 错误: 找不到依赖信息

Posted

技术标签:

【中文标题】dpkg-shlibdeps: 错误: 找不到依赖信息【英文标题】:dpkg-shlibdeps: error: no dependency information found for 【发布时间】:2012-06-29 14:08:11 【问题描述】:

我正在编译一个 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-shlibdeps,因为我正在使用 dpkg-buildpackage 并且 dpkg-buildpackage 调用 dpkg-shlibdeps ...

我已经试过了:

sudo dpkg-buildpackage -rfakeroot -d -B

还有:

export DEB_DH_MAKESHLIBS_ARG=--ignore-missing-info

作为根用户。

有什么想法吗?

【问题讨论】:

【参考方案1】:

最后我用蛮力做到了:

我编辑了脚本 /usr/bin/dpkg-shlibdeps,改变了这个:

my $ignore_missing_info = 0;

my $ignore_missing_info = 1;

【讨论】:

这似乎是一个非常危险的想法。如果你想替换二进制文件,你至少应该尝试将替代品放入 /usr/local/ 哎哟!是的...不要那样做。不是一个好的解决方案。 @dequis 有您想要使用的解决方案,但他提出的依赖项不起作用(即依赖自己是不好的,但由于这是需要正确定义的库,它仍然是错误的。我把对我所做的事情发表评论,它就像一个魅力。)【参考方案2】:

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

因此,通过修改包构建过程的一部分的正确方法是编辑 debian/rules。 如果没有看到实际的 debian/规则,很难给你更多提示。

【讨论】:

【参考方案3】:

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

dh_shlibdeps

到:

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

【讨论】:

如果 debian/rules 文件不包含该行怎么办? 某行必须触发该消息,这意味着必须有一些规则正在调用 dpkg-shlibdeps。如果不是 dh_shlibdeps 包装脚本,那是什么? @WesHardaker 在 CPack 的情况下,没有 debian/rules 文件。【参考方案4】:

使用:

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

如果您的规则文件中没有 dh_shlibdeps 调用。如果你已经

%:
    dh $@

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

【讨论】:

【参考方案5】:

您只是拼错了您的导出。应该是这样的:

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

【讨论】:

【参考方案6】:

您可能还想修复错误的根源,而不是仅仅忽略错误,这通常是包含触发错误的共享库的包中缺少或不正确的package.shlibspackage.symbols 文件。

[1] 记录了dpkg-shlibdeps 如何使用package.shlibs resp。 package.symbols, files, [2] 记录了package.shlibspackage.symbols 文件的格式。

[1]https://manpages.debian.org/jessie/dpkg-dev/dpkg-shlibdeps.1.en.html [2]https://www.debian.org/doc/debian-policy/ch-sharedlibs.html

【讨论】:

如果您正在构建的包提供私有共享库,更好的方法是使用dpkg-shlibdeps-ldirectory 选项 - 请参阅manpages.debian.org/testing/dpkg-dev/dpkg-shlibdeps.1.en.html【参考方案7】:

另一种方式,无需修改构建脚本,只需创建一个文件。

您可以通过使用以下格式创建debian/shlibs.local 来指定local shlib overrides:library-name soname-version dependencies

例如,给定以下(修剪后的)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 ... 时遇到问题的库,看看它依赖于什么。【参考方案8】:

你可以用这个:

dh_makeshlibs -a -n

就在 dh_install 之后

【讨论】:

以上是关于dpkg-shlibdeps: 错误: 找不到依赖信息的主要内容,如果未能解决你的问题,请参考以下文章

在 Vue.js 中找不到这些依赖项错误

无法使用 ivy.xml 解决依赖关系,找不到模块错误

Eclipse中的JNI Unsatisfied Link错误找不到依赖库

使用 SenchaCmd 构建时出现 SenchaTouch 错误:找不到文件以供依赖参考

找不到依赖程序集 Microsoft.VC90.CRT 错误

依赖项目中引入aar包,编译时提示找不到引入的aar包