如何以编程方式检查库依赖程序是否可以 运行 在 Linux 系统中?
How to programmatically check whether a library dependent program can run in a Linux system?
我有一个程序(二进制),它依赖于 pthread、sqlite3、libcrypto 等库,libcurl.I 想 运行 在多个用户 PCs.How 中以编程方式检查这个程序在安装二进制文件之前是否满足依赖关系?
./configure 不能按原样用于构建程序,如 中所述。
如果我没记错的话,.deb 和 .rpm 有自己的方法。
任何人都可以告诉我他们遵循的方法是什么 this.Is 它只是一个文件名检查?例如,如果我使用 libcurl.so.3 构建程序,它是否会检查将 运行ning 所在的系统是否将 libcurl.so.3 作为常规文件或simulink.Or图书馆还有其他支票吗?
在安装和 运行 二进制文件时检查依赖关系的可靠方法是什么?
构建包
您可以将您的程序作为 .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)
当找不到所需的库时,打印 "not found":
$ 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。
保持简单,笨蛋
您可以尝试 运行 您的程序,当它由于缺少库而失败时,然后...您知道您缺少一些库;)
RPM 会自动检测使用过的库,并将需要的 Requires 放入最终的 RPM 包中。您可以使用以下方式检查它:
rpm -qpR foo.rpm
它应该打印出如下内容:
libc.so.6(GLIBC_2.8)(64bit)
libdl.so.2()(64bit)
我有一个程序(二进制),它依赖于 pthread、sqlite3、libcrypto 等库,libcurl.I 想 运行 在多个用户 PCs.How 中以编程方式检查这个程序在安装二进制文件之前是否满足依赖关系?
./configure 不能按原样用于构建程序,如
任何人都可以告诉我他们遵循的方法是什么 this.Is 它只是一个文件名检查?例如,如果我使用 libcurl.so.3 构建程序,它是否会检查将 运行ning 所在的系统是否将 libcurl.so.3 作为常规文件或simulink.Or图书馆还有其他支票吗?
在安装和 运行 二进制文件时检查依赖关系的可靠方法是什么?
构建包
您可以将您的程序作为 .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)
当找不到所需的库时,打印 "not found":
$ 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。
保持简单,笨蛋
您可以尝试 运行 您的程序,当它由于缺少库而失败时,然后...您知道您缺少一些库;)
RPM 会自动检测使用过的库,并将需要的 Requires 放入最终的 RPM 包中。您可以使用以下方式检查它:
rpm -qpR foo.rpm
它应该打印出如下内容:
libc.so.6(GLIBC_2.8)(64bit)
libdl.so.2()(64bit)