从源安装。如何在不破坏包管理器的情况下解决依赖关系

从源安装。如何在不破坏包管理器的情况下解决依赖关系

编译和安装软件是我无法克服的痛苦和问题。我只是想与更有知识的人一起了解我对这个过程的理解,以理清我的思路,以达到下一个水平。

我需要的许多科学软件都不是作为软件包分发的。我理解“./configure”设置编译变量并检查依赖关系“make”是否编译“sudo make install”将所有库和bin放在它们的位置。然而它从来没有起作用。我很少在不进入依赖地狱的情况下退出a)“./configure”阶段,如果我这样做,b)“sudo make install”可能会毁掉我的盒子。

a) 依赖地狱是非常令人沮丧的。有时我有图书馆,但它不喜欢它。或者图书馆不想安装。或者“配置”找不到它。或者我的发行版将其放置在不应该放置的地方。或者我的系统中有两个版本。问题是,我不明白如何诊断并解决这些问题。对于不需要成为程序员的人来说,有哪些好的参考资料可供学习?

b)我的理解是“make install”将替换一些库并更改设置,而我的包管理器不知道这一点。因此,某些程序将无法运行,其他程序则无法更新。因此,如果我不使用“make install”,而只是将编译后的二进制文件保留在我的用户目录中,并将符号链接添加到 PATH 中,我会清楚吗?

我的盒子是单用户的,有大量的免费高清,所以我并不真正关心拥有多个(数十个)库的副本是否可以解决我的问题。空间很便宜。

答案1

大多数软件包都有一个<package>-dev(对于基于 Debian 的)或<package>-devel(对于基于 Red Hat 的),它们将是构建时链接所需的库。

因此,例如,如果来源说它需要libxml,那么在基于 Debian 的系统中您将找到libxml2libxml2-dev(用于apt-cache search <dependancy>查找它们)。

您需要libxml2-dev构建它并libxml2运行它。

./configure步骤通常支持标志,例如--with-libxml=/usr/lib/将其指向正确的库(./configure --help应列出所有选项)。它通常还支持使用 更改安装位置--prefix=$HOME/sw。使用包管理器控制之外的前缀是避免与包管理器安装的软件发生冲突的最佳方法。

在 Debian 及衍生品上使用--prefixof/usr/local//opt/local/应该是安全的。

如果包管理器中无法提供您需要的库(或版本),只需下载源代码并使用类似的选项进行编译。最重要的是使用--prefix包管理器的外部,并且在编译软件时真的想用--with-<library>=/<path/to/installed/library>.

答案2

有一个工具auto-apt可以用于此目的。

男人自动适应:

auto-apt 是一个检查在 auto-apt 环境中运行的程序的文件访问的程序。如果程序将访问未安装的软件包的文件,auto-apt 将使用 apt-get 安装包含该文件的软件包。

它的使用方法如下:

auto-apt run ./configure

另一种方法是在基于 Debian 的发行版上使用apt-get build-dep <package>

答案3

对于基于 RPM 的发行版,您可以尝试创建适当的包(这不是难的...)。

正确的软件包的好处是您的软件包管理器可以跟踪软件,并且您可以轻松地将您的设置复制到其他地方/下一台机器上。使用正确的源包向前移植(新的上游版本、错误修复补丁、更新底层库)比下次从头开始解决所有问题更容易。

相关内容