每次当我想在 Linux 上从源代码构建应用程序时,我都必须在我的操作系统(ubuntu)中安装依赖项库。
典型场景:
启动 ./configure 出现有关缺少库的错误: xyz sudo apt-get install libxyz-dev 转到步骤 1。最后,我的操作系统混乱且依赖项存在问题。例如:
以下软件包具有未满足的依赖关系:
librsvg2-dev : Depends: libglib2.0-dev (>= 2.12.0) but it is not going to be installed
Depends: libgdk-pixbuf2.0-dev (>= 2.21.6) but it is not going to be installed
Depends: libcairo2-dev (>= 1.2.0) but it is not going to be installed
Depends: libgtk2.0-dev (>= 2.21.5) but it is not going to be installed
总是问自己现在做什么?我应该强制 ubuntu 安装更高版本的库吗?
这是我的问题:
也许还有另一种在 linux(ubuntu) 上从源代码构建软件的方法。一些隔离方式。未集成到我的操作系统?我来自java世界,在那里构建一个应用程序!=安装系统中的每个依赖项。有什么建议吗?最佳实践 ?
答案1
你在这里有不止一个问题,我认为主要的一个问题是如何处理“但它不会被安装”。 我对此没有答案,但我可以说,如果发生这种情况是因为您感到沮丧并在某个时候强制安装了某些东西,那么您必须学会放慢速度并注意具体细节。简单地说“最后我一团糟”并没有说明太多。
十多年来,我一直在 Linux 上从源代码进行构建,并且发行版包管理器很少出现任何问题。一些源打包程序在指示依赖关系方面做得不好,或者无法.configure
正确完成它,这可能是一个很大的麻烦,但它不应该导致您的发行版二进制文件出现“未满足的依赖关系”问题,除非您'发行版安装程序出了问题。
例如:
librsvg2-dev : Depends: libglib2.0-dev (>= 2.12.0)
2.12 很古老——我在网上找不到版本历史,但我认为大约有 10 年的历史。你不可能有一个使用比这个更旧的 glib 的 ubuntu 版本。所以你的包管理出了问题。
这与源代码构建的过程没有太大关系。
我来自java世界并且...
所以,这就是 C/C++ 的世界。 Java 更加整体化和独立,这使得某些事情变得更容易,但也有一些权衡——请记住 C/C++ 有它自己的一些优点。
答案2
Java 交付时大多数库已经在虚拟机中,有时 Java 程序包含打包在 jar 中的外部库。但是,如果您有很多程序与相同的库捆绑在一起,那么您就会浪费大量空间。
Java 本身引入了许多依赖项,并为您的软件提供了所需的一切。我经常将 Java 视为不同操作系统库的包装器,统一它们的功能。尽管这并不完全正确,而且 Java 还提供了更多功能。
有一个很棒的包管理器,可以从源代码编译每个软件,处理依赖关系,在需要时安装它们,并在不再需要时删除它们。然而,Portage 是 Gentoo Linux 的核心,可以将它与其他包管理器一起使用,但我没有经验它实际上效果如何。
您可以查看Gentoo 前缀将 Portage 引入除 Gentoo 本身之外的任何操作系统中,但我必须警告您,这可能不是很容易做到,而且肯定是高度实验性的,并且可能会破坏一切。