如何以编程方式检查依赖库的程序是否可以在Linux系统中运行?
我有一个程序(二进制),这取决于库,如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进行检测。或者,还有其他任何检查图书馆?
在安装和运行二进制文件时检查依赖关系的可靠方法是什么?
构建一个包
你可以发布你的程序作为.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)
不幸的是,ldd
does not return useful exit code in that case。
保持简单,愚蠢
你可以只尝试运行您的程序,并由于缺少库的时候失败了,那么......你知道,你是缺少一些库)
他可能需要编写脚本在[%pre%]或'%install%'部分中,例如[在规范步骤中以编程方式失败RPM安装](https:// stackoverflow。com/q/4037410/608639) – jww
@ el.pescado ..在这种情况下,我必须检查失败的依赖关系的“未找到”字符串。实际上.... ldd反过来将使用一些逻辑来找出依赖关系。有关这个的任何想法?我想我必须分析ldd的源代码。 – BusyTraveller
'ldd'是一个使用'ld-linux'(可能在不同地方安装的shell脚本,例如'/ lib64/ld-linux-x86-64.so.2')使用'--verify'标志的shell脚本。 –
RPM会自动检测使用的库并将需要的需求放入最终的RPM包中。你可以用一下:
rpm -qpR foo.rpm
,它应该打印出类似这样:
libc.so.6(GLIBC_2.8)(64bit)
libdl.so.2()(64bit)
'LDD /路径/到/ binary' –
相关(也可能是重复的):如何使转速自动安装依赖关系](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