问题描述
在apt-get man’s page上,可以找到:
install pkg(s)
This option is followed by one or more packages desired for installation. Each package is a package name, not a fully qualified filename (for instance, in a Fedora Core system, glibc would be the argument provided, not glibc-2.4.8.i686.rpm).
All packages required by the package(s) specified for installation will also be retrieved and installed.
[…]build-dep source_pkg
Causes apt-get to install/remove packages in an attempt to satisfy the build dependencies for a source package.
听起来这两个都试图满足依赖关系,但是我在安装matplotlib
的过程中得到了不同的结果:apt-get intall
在我的virtualenv中不能与我后续的pip install matplotlib
一起使用,而apt-get build-dep
确实*。
*
是的,我需要在一个venv中安装matplotlib
,但是pip无法解决一些依赖关系,所以我懒得用apt来解决它
最佳解决方法
简短的版本。
apt-get install
安装新软件包,自动解析和下载依赖软件包。如果已安装软件包,请尝试升级到最新版本。
apt-get build-dep
导致apt-get安装/删除包以尝试满足源包的构建依赖性。
命令sudo apt-get build-dep packagename
意味着安装’packagename’的所有依赖项,以便我可以构建它。所以build-dep是一个apt-get命令就像安装,删除,更新等。
build-dep
命令搜索系统中的本地存储库并安装程序包的构建依赖项。如果本地存储库中不存在该包,则它将返回错误代码。
有关安装matplotlib的信息,请参阅To Install matplotlib on Ubuntu
资料来源:ManPage& Ravi Saive
次佳解决方法
区别在于运行时是否需要依赖项而不是构建时。
例如,也许我正在构建一个使用openssl的二进制文件。在构建时,我需要openssl头文件,它们位于libssl-dev
中。然后我会将其列为Build-Depends
。
但是,生成的二进制文件和包不需要头文件和其他开发文件,因此在安装时我不需要libssl-dev
。那时它不会在Depends
中。但是我的二进制文件链接的运行时库libssl
需要在Depends
中。
你引用的man部分表明了这一点(它讨论了“满足包的构建依赖性”),但是如果不事先知道何时使用Build-Depends,这可能会令人困惑。
查看有关控制文件字段定义的Debian策略指南:
http://www.debian.org/doc/debian-policy/ch-controlfields.html
这是关于Build-Depends的部分。请注意它位于“源包的依赖项”标题下:
http://www.debian.org/doc/debian-policy/ch-relationships.html#s-sourcebinarydeps
这个谈论取决于Depends。请注意它在二进制包标题下:
http://www.debian.org/doc/debian-policy/ch-relationships.html#s-binarydeps