2014-12-01 61 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