簡體   English   中英

如何以編程方式檢查依賴庫的程序是否可以在Linux系統中運行?

[英]How to programmatically check whether a library dependent program can run in a Linux system?

我有一個依賴於pthread,sqlite3,libcrypto和libcurl等庫的程序(二進制),我想在多台用戶PC上運行此程序。在安裝二進制文件之前,如何以編程方式檢查是否滿足依賴關系?

./configure不能直接用於構建程序,如os獨立的配置文件中檢查curl依賴關系中所述 如果我沒有記錯的話,.deb和.rpm有自己的方法。

誰能告訴我他們使用的方法是什么,這僅僅是文件名檢查嗎? 例如,如果我使用libcurl.so.3來構建程序,則它是否檢查將運行其的系統是將libcurl.so.3作為常規文件還是simulink。或者是否存在其他任何檢查圖書館?

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

建立一個包裹

您可以將程序作為.deb.rpm軟件包分發。 兩種格式都支持指定需要存在的依賴關系:

使用ldd手動檢查

您可以使用ldd(1)檢查是否安裝了必需的共享庫以及如何解決它們:

$ 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)

不幸的是, 在這種情況下ldd 不會返回有用的退出代碼

保持簡單,愚蠢

您可以嘗試運行程序,但是由於缺少庫而導致程序失敗時,那么...您知道您缺少某些庫;)

RPM將自動檢測已使用的庫,並將所需的需求放入最終的RPM軟件包中。 您可以使用以下方法進行檢查:

rpm -qpR foo.rpm

它應該打印如下內容:

libc.so.6(GLIBC_2.8)(64bit)
libdl.so.2()(64bit)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM