看着https://askubuntu.com/a/207750/23678作者如何知道缺少哪个依赖项?是否有通用的方法来查找可执行文件的依赖项列表以及缺少哪些依赖项?
更新:我刚刚注意到https://stackoverflow.com/a/9082947/14731用过的
readelf -l [可执行]
这是最好的方法吗?
答案1
在链接的 AskUbuntu 问题中,作者知道缺少哪个依赖项,因为他试图在 64 位 Ubuntu 安装上安装 32 位应用程序,引用他的话:
Ubuntu 64 位中缺少一些 32 位库。
所以他需要安装它们。
不过,回答你的问题:
- 如何检测可执行文件缺少的依赖项?
- 是否有一种通用的方法来查找可执行文件的依赖项列表以及哪些依赖项缺失?
是的,有一种方法可以检测缺少的依赖项或获取它们的列表。
检测缺失的依赖项:
这包管理系统 apt
基于 Debian 的 Linux 发行版中使用的 是一个聪明的系统,它会自动检测当前安装的软件包是否缺少依赖项(即使您使用dpkg
而不是安装了它们apt-get
)。假设您安装了一个软件包,但没有安装其依赖项,那么下次执行 时apt-get upgrade
,您将收到类似以下的错误:
The following packages have unmet dependencies:
package1 : Depends: package2 (>= 1.8) but 1.7.5-1ubuntu1 is to be installed
表示package1
依赖于package2
,并且package2
(即本例中的较新版本)未安装。通常,要解决此问题,请执行命令sudo apt-get install -f
,该命令指示apt-get
尝试检索和安装缺少的软件包。
查找可执行文件的依赖项列表:
该apt
套件以及dpkg
提供了一种简洁的方法来列出包的依赖关系。
对于
apt
,命令是:apt-cache depends <packagename>
这将检查存储库中的包并列出依赖项以及“建议”包。如果您确实想单独过滤掉依赖项,可以通过执行以下操作来过滤输出:
apt-cache depends <packagename> | grep Depends
。以下是示例输出:alaa@aa-lu:~$ apt-cache 依赖 vlc 甚高频 依赖:fonts-freefont-ttf 取决于: vlc-nox |依赖: libavutil51 依赖: libxpm4 依赖: zlib1g 预依赖:dpkg 建议:videolan-doc 推荐:vlc-plugin-notify 推荐:xdg-utils 中断:vlc-data 休息:vlc-nox 替换:vlc-data 替代:vlc-nox
为了简洁起见,输出被削减。
对于
dpkg
,在本地文件上运行它的命令是:dpkg -I file.deb | grep Depends
dpkg -I file.deb
返回有关该文件的大量信息.deb
,因此我们对其进行过滤以仅查看依赖项。
自从apt
实际上只是 dpkg 的一个前端这两个命令本质上都做了同样的事情,它们会查看.deb
应用程序的文件以找出它需要哪些依赖项,只不过apt-cache
会查看存储库。这些“依赖项”列在里面文件.deb
作为元数据,这就是为什么即使你已经从网站(例如,来自谷歌网站的谷歌 Chrome 浏览器)手动下载并安装了应用程序(通常是一个.deb
文件,因此你将使用dpkg
而不是安装它),仍然会通过分析已安装的软件包发现缺少依赖项。apt
apt
我不太熟悉所有这些计算机架构的东西,但就这个问题中的 Java 而言,它实际上是关于 32 位和 64 位架构的。引用 stackoverflow 的答案:
您正在使用 64 位系统运行,没有 32 位运行环境。
需要安装的特定库未包含在安装包的“依赖项”部分中,因为他在 64 位系统上安装的是 32 位应用程序。因此,需要进行额外的故障排除才能找到罪魁祸首,因此使用了readelf
和ldd
。但是,这些可能更特定于库,请记住“依赖项”并不总是“库”,也可能是其他应用程序。所以“这是最好的方法吗?“,我对此表示怀疑;我认为只有在需要额外故障排除时它才是最好的。