我想在计算机上安装一个无法重新编译的可执行文件,该可执行文件不是作为包构建的,并且我想下载运行它们所需的库。
ldd
以下是在其上运行的部分输出
libpango-1.0.so.0 => /usr/lib/i386-linux-gnu/libpango-1.0.so.0 (0xb702f000)
libcairo.so.2 => /usr/lib/i386-linux-gnu/libcairo.so.2 (0xb6f64000)
libatk-1.0.so.0 => /usr/lib/i386-linux-gnu/libatk-1.0.so.0 (0xb6f43000)
libsqlite3.so.0 => /usr/lib/i386-linux-gnu/libsqlite3.so.0 (0xb6e9e000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb6cf4000)
/lib/ld-linux.so.2 (0xb786e000)
libxcb.so.1 => /usr/lib/i386-linux-gnu/libxcb.so.1 (0xb6cd3000)
libgio-2.0.so.0 => /usr/lib/i386-linux-gnu/libgio-2.0.so.0 (0xb6b7c000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb6b4f000)
是否有一种工具可以使用此信息来选择应下载哪些包,或者更好的是仅提取列出的库及其依赖项,以最大限度地减少磁盘使用量?系统运行在无头虚拟机上,程序将通过VNC显示。
虽然我怀疑一个完整的图形桌面将提供大部分所需的库,但我只想下载所需的库、它们的依赖项以及足够的 X Windows 软件包来支持它。
答案1
您还没有说明您正在使用哪个操作系统,因此我将假设 Linux 并使用 Debian 作为示例。据我所知,对你的问题的快速回答是否定的。但这可能是一个有用的解决方法:
ldd your_prog | awk '{print $1}' | sed 's/\..*//' |
while read n; do echo "----- $n ----"; apt-cache search ^$n; done
这将解析ldd
输出,然后运行apt-cache
(将其替换为您操作系统的等效项)以在存储库中搜索名称和描述包含 . 返回的库名称的第一部分的包ldd
。
这不会找到所有的结果,并且会对某些结果(例如 )给出太多结果,libc
但它可能会有所帮助。
@FaheemMitha 指出这apt-file
可能是更好的方法。例如:
ldd /bin/bash | awk '/=>/{print $(NF-1)}' |
while read n; do apt-file search $n; done |
awk '{print $1}' | sed 's/://' | sort | uniq
这将返回提供链接库的包名称列表。
答案2
@terdon 的答案很好,但是使用Debian 系统上默认安装的dpkg-query
different 来实现这一点甚至更容易。apt-file
ldd /bin/bash | awk '/=>/{print $(NF-1)}' | while read n; do dpkg-query -S $n; done | sed 's/^\([^:]\+\):.*$/\1/' | uniq
这会生成一个包列表。
答案3
最好的选择是找到一个真正支持您的发行版的软件包。但如果这对你不起作用,那么我只知道另一种方法。
照常运行 ldd,然后手动安装这些依赖项。
例如libpango-1.0.so.0 => /usr/lib/i386-linux-gnu/libpango-1.0.so.0 (0xb702f000)
对我来说意味着安装apt-get install libpango:i386
并祈祷 Debian stable 中的版本足够好。
你需要浏览 ldd、Google 的每一行,查看你可用的存储库,基本上你会很幸运。然后一一安装。直到程序真正运行起来。但 ldd 仅适用于“简单”程序。调用插件或运行任意代码的程序完全是另一回事。对于这些,您需要从控制台运行,并在发生崩溃/错误时修复它们。
也就是说,仅二进制可执行文件非常难以维护。您可能需要考虑使用其他东西。如果您的发行版比构建该可执行文件的系统稍微领先或落后一点,您可能永远无法让它工作。