2017-06-06 51 views
0

我有一個程序(二進制),這取決於庫,如pthread,sqlite3,libcrypto和libcurl.I想要在多用戶PC上運行此程序。如何在安裝二進制程序之前以編程方式檢查是否符合依賴關係?如何以編程方式檢查依賴庫的程序是否可以在Linux系統中運行?

./configure不能用於構建Making os independent configure file which checks for curl dependency中提到的程序。 如果我沒有錯,.deb和.rpm都有自己的方法。

任何人都可以告訴我他們爲此遵循什麼方法。它只是一個文件名檢查?例如,如果我使用libcurl.so.3構建了該程序,它是否會檢查將要運行的系統是否將libcurl.so.3作爲常規文件或simulink進行檢測。或者,還有其他任何檢查圖書館?

在安裝和運行二進制文件時檢查依賴關係的可靠方法是什麼?

+1

'LDD /路徑/到/ binary' –

+0

相關(也可能是重複的):如何使轉速自動安裝依賴關係](https://stackoverflow.com/q/13876875/608639),[在構建RPM包之前自動安裝構建依賴項](https://stackoverflow.com/q/13227162/608639),[未能通過RPM (https://stackoverflow.com/q/4037410/608639),[檢查RPM依賴關係](https://stackoverflow.com/q/19077538/608639)等等。 – jww

回答

4

構建一個包

你可以發佈你的程序作爲.deb.rpm包。這兩種格式都支持指定需要存在依賴關係:你可以使用ldd(1)檢查是否安裝了必要的共享庫

手動檢查使用LDD

以及如何他們得到解決:

$ ldd /usr/bin/xterm 
     linux-vdso.so.1 => (0x00007fff649ff000) 
     libXft.so.2 => /usr/lib/x86_64-linux-gnu/libXft.so.2 (0x00007fc5195cd000) 
     libXaw.so.7 => /usr/lib/x86_64-linux-gnu/libXaw.so.7 (0x00007fc51935b000) 
     libutempter.so.0 => /usr/lib/libutempter.so.0 (0x00007fc519158000) 
     libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007fc518f2f000) 
     libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc518ba2000) 
     libfontconfig.so.1 => /usr/lib/x86_64-linux-gnu/libfontconfig.so.1 (0x00007fc51896a000) 
     libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007fc51862f000) 
     libXmu.so.6 => /usr/lib/x86_64-linux-gnu/libXmu.so.6 (0x00007fc518415000) 
     libXt.so.6 => /usr/lib/x86_64-linux-gnu/libXt.so.6 (0x00007fc5181ad000) 
     libICE.so.6 => /usr/lib/x86_64-linux-gnu/libICE.so.6 (0x00007fc517f92000) 
     libfreetype.so.6 => /usr/lib/x86_64-linux-gnu/libfreetype.so.6 (0x00007fc517cf3000) 
     libXrender.so.1 => /usr/lib/x86_64-linux-gnu/libXrender.so.1 (0x00007fc517ae9000) 
     libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007fc5178d7000) 
     libXpm.so.4 => /usr/lib/x86_64-linux-gnu/libXpm.so.4 (0x00007fc5176c6000) 
     /lib64/ld-linux-x86-64.so.2 (0x00007fc5197f8000) 
     libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fc5174ae000) 
     libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007fc517284000) 
     libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007fc517064000) 
     libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fc516e5f000) 
     libSM.so.6 => /usr/lib/x86_64-linux-gnu/libSM.so.6 (0x00007fc516c58000) 
     libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007fc516a54000) 
     libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007fc51684f000) 
     libuuid.so.1 => /lib/x86_64-linux-gnu/libuuid.so.1 (0x00007fc51664a000) 

當所需的庫都沒有找到, 「未找到」 被打印:

$ ldd bar 
     linux-vdso.so.1 => (0x00007fffde7ff000) 
     libfoo.so => not found 
     libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5954eae000) 
     /lib64/ld-linux-x86-64.so.2 (0x00007f5955251000) 

不幸的是,ldddoes not return useful exit code in that case

保持簡單,愚蠢

你可以只嘗試運行您的程序,並由於缺少庫的時候失敗了,那麼......你知道,你是缺少一些庫)

+0

他可能需要編寫腳本在[%pre%]或'%install%'部分中,例如[在規範步驟中以編程方式失敗RPM安裝](https:// stackoverflow。com/q/4037410/608639) – jww

+0

@ el.pescado ..在這種情況下,我必須檢查失敗的依賴關係的「未找到」字符串。實際上.... ldd反過來將使用一些邏輯來找出依賴關係。有關這個的任何想法?我想我必須分析ldd的源代碼。 – BusyTraveller

+0

'ldd'是一個使用'ld-linux'(可能在不同地方安裝的shell腳本,例如'/ lib64/ld-linux-x86-64.so.2')使用'--verify'標誌的shell腳本。 –

0

RPM會自動檢測使用的庫並將需要的需求放入最終的RPM包中。你可以用一下:

rpm -qpR foo.rpm 

,它應該打印出類似這樣:

libc.so.6(GLIBC_2.8)(64bit) 
libdl.so.2()(64bit) 
相關問題