2014-12-01 105 views
2

我试图用dpkg-buildpackage创建我的Qt应用程序的.deb包。我编译了第三方(snmp)以用于我的应用程序。它运行成功。但产生的.deb一个应用程序时得到了错误:dpkg-shlibdeps:错误:找不到依赖信息

的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的2个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作为一种解决方法。

感谢

+0

感谢您提及将dpkg-shlibdeps编辑为$ ignore_missing_info = 1的选项。这对我有效! – 2017-02-17 20:17:19

回答

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中发送一个“官方”deb的副本,或安排libsnmp30在-backports存储库中发货。然后,您只需在libsnmp-dev (>= whatever)上将Build-Depends:添加到您的包中,然后根据该包构建(而不是在/usr/local中手动安装的.so文件)。 (c):如果你实际上不需要做snmp的自定义编译,并且你的操作系统/发行版中可用的版本足够好,那么只需Build-Depends:就可以了,并且删除手动安装的.so文件在/usr/local