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

时间:2014-12-01 17:37:35

标签: c++ qt build ld packaging

我正在尝试使用dpkg-buildpackage创建我的Qt应用程序的.deb包。我编译了第三方(snmp)以在我的应用程序中使用。它运行成功。但是在生成.deb应用程序时出现错误:

dpkg-shlibdeps:错误:未找到/usr/local/lib/libnetsnmp.so.30的相关信息

我一直在寻找这个链接中的解决方案:

dpkg-shlibdeps: error: no dependency information found for

以及其他页面,但没有找到解决方案。

我尝试编辑/etc/ld.so.conf来添加libnetsnmp.so.30路径,但它没有用。

我刚刚意识到运行命令时:

ldconfig -p | grep libnetsnmp.so.30

我在ldconfig中有两个libnetsnmp.so.30库,并且它们彼此不同。

libnetsnmp.so.30 (libc6,x86-64) => /usr/local/lib/libnetsnmp.so.30
libnetsnmp.so.30 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libnetsnmp.so.30

我也试过只提供其中一个。但它没有用。

有没有办法生成带或不带这个lib的.deb包?

Obs。:我不打算将 / usr / bin / dpkg-shlibdeps 编辑为 $ ignore_missing_info = 1 作为解决方法。

由于

1 个答案:

答案 0 :(得分:6)

dpkg-shlibdeps是一个工具,旨在通过动态链接找出新包所依赖的所有包。它通过检查所有新的二进制文件来查看它们链接到哪些库,以及使用这些库中的符号,然后检查dpkg数据库以查看哪些包拥有这些库并找到提供所需的最低包版本。必要的符号。

在您的情况下,它会看到您的应用程序与libnetsnmp.so.30链接,因此它会检查该库拥有哪个包。糟糕,没有包裹。那个错误来自哪里 - 也许你已经知道了所有这些,但我认为我将它包含在上下文中。

现在,正确的解决方案取决于您希望如何处理自定义编译的snmp库。基本上选择是(a)将自定义libnetsnmp与您的包一起发送,(b)单独打包自定义libnetsnmp,或者(c)根本不使用自定义libnetsnmp;使用操作系统提供的任何libsnmp*包。

(a):要使用您的软件包发送libnetsnmp,您需要小心确保它不提供与标准libsnmp软件包相同的SONAME,因此它们不会干扰彼此。最简单的方法可能是静态链接(链接.a.o文件而不是.so动态库。如果您的软件包适用于Debian或Ubuntu,这可能会令人不悦,但如果您证明选择(b)和(c)对您来说不可行,那么它可能会没问题。

(b):正确包装库是一个相当深入的主题; StackOverflow答案太多了。但文档就在那里。根据您从上游版本更改libnetsnmp的程度,您可能希望更改库的名称(和SONAME)以避免混淆。如果您的libnetsnmp只是Debian sid或Ubuntu中较新的libsnmp软件包的后端,那么正确的事情可能是发送一份"官方"您的PPA中libsnmp30 deb或安排{-1}}在-backports存储库中发送。然后,您只需要在libsnmp30上添加Build-Depends:到您的包,并针对它进行构建(而不是libsnmp-dev (>= whatever)中手动安装的.so文件)。

(c):如果你实际上并不需要对snmp进行自定义编译,并且你的OS /发行版中可用的版本足够好,那么只需要/usr/local,然后删除在Build-Depends:中手动安装.so文件。