我正在尝试使用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

我也尝试只提供其中之一。但这没有用。

有没有这个库,有没有办法生成.deb软件包?

观察:我不打算将 / usr / bin / dpkg-shlibdeps 修改为 $ ignore_missing_info = 1 作为解决方法。

谢谢

最佳答案

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

在您的情况下,它将看到您的应用程序与该libnetsnmp.so.30链接,因此它将检查是否有哪个软件包拥有该库。糟糕,没有包裹可以。这就是错误的根源-也许您已经知道了所有这些,但是我想我会把它包括在上下文中。

现在,正确的解决方案取决于您如何对待自定义编译的snmp库。基本上,选择是(a)将您的自定义libnetsnmp与您的软件包一起运送,(b)将您的自定义libnetsnmp单独打包,或者(c)完全不使用自定义libnetsnmp;请改用您的操作系统提供的libsnmp*软件包。

(a):要将libnetsnmp与您的软件包一起提供,您需要小心确保其提供的SONAME与标准libsnmp软件包没有相同,以免它们相互干扰。最简单的方法可能是静态链接(链接到.a.o文件而不是.so动态库)。如果您的软件包是用于Debian或Ubuntu的,这可能会让人皱眉,但是如果您证明(b)和(c)选择对您不可行,那可能会很好。

(b):正确包装图书馆是一个相当深入的话题;对于StackOverflow答案来说太多了。但是文档在那里。根据上游版本对libnetsnmp所做的更改,您可能需要更改库的名称(和SONAME),以免造成混淆。如果您的libnetsnmp只是Debian sid或Ubuntu中较新的libsnmp软件包的反向移植,那么正确的选择可能是在PPA中运送“官方” libsnmp30 deb的副本或安排将libsnmp30运送到-backports存储库中。然后,您只需要在Build-Depends:上添加一个libsnmp-dev (>= whatever)到您的包中,并以此为基础进行构建(而不是在/usr/local中手动安装的.so文件)。

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

07-28 08:05