从源代码构建和使用安装软件包有什么区别?


46

我想知道:安装某些东西时,有一种双击安装可执行文件的简便方法,另一方面,有一种从源代码构建它的方法。

后者下载源代码包确实很麻烦。

但是,这两种方法之间的根本区别是什么?

Answers:


44

所有软件都是程序,也称为源程序包。因此,需要首先构建所有源软件包,然后才能在您的系统上运行。

二进制软件包是已经由某人从源代码构建的软件包,该软件包具有软件中提供的常规功能和参数,因此大量用户可以安装和使用它。

二进制软件包易于安装
但是可能没有上游软件包中的所有选项

因此,要从源代码安装,您需要自己构建源代码。这意味着您需要自己照顾依赖性。另外,您还需要了解软件包的所有功能,以便可以相应地构建它。

从源安装的优点:

  • 您可以安装最新版本,并且可以始终保持更新,无论是安全修补程序还是新功能。
  • 允许您在安装时缩减功能部件,以适应您的需求。
  • 同样,您可以添加一些二进制文件中可能未提供的功能。
  • 将其安装在所需的位置。
  • 对于某些软件,您可以提供特定于硬件的信息以进行适当的安装。

简而言之,从源代码进行安装可为您提供繁重的自定义选项,同时需要花费很多精力,而从二进制文件进行安装则更为容易,但您可能无法根据需要进行自定义

更新:在下面的注释中添加与安全性有关的参数。是的,从二进制安装时确实没有源代码的完整性。但这取决于您从何处获取二进制文件。有很多值得信赖的资源,您可以从中获取任何新项目的二进制文件,唯一的缺点是time。更新的二进制文件或什至一个新项目可能需要一些时间才能出现在我们的受信任存储库中。

最重要的是,关于软件安全性,我想Joe在下面的评论中提供的实验室中重点介绍这一有趣的页面


4
还可以针对您的系统以最佳方式编译源代码(这可能不是一个好主意,因为这样编译的内容是“特定于”系统的,可能无法在备份系统上工作...但是您拥有源,您可以重新编译(如果有时间的话))
Olivier Dulac 2014年

这取决于您是否拥有该“备份系统”。如果您只是在做一些研究,通常就不会。
h22 2014年

1
对于超偏执狂,从源代码安装的一个优点是安全性和能够(如果可以)查看代码的能力:从源代码安装时,您知道事实是您从该源代码中获得了二进制文件,而没有具有未知修改的二进制文件(假设您首先信任源代码)。
LawrenceC

6
@ultrasawblade-您显然还不够偏执!<G>- 有关完整金额,请参见cm.bell-labs.com/who/ken/trust.html
2014年

32

源文件包含开发人员以他/她选择的任何语言(C,C ++,Python等)编写的原始代码,并且具有通用性。它不特定于任何发行版,在许多情况下也不特定于任何操作系统。

软件包(例如RPM或DEB)是为特定发行版预先准备的二进制可执行文件(或解释的脚本等)。包维护人员将为您准备编译源(添加任何必要的补丁程序等),实际编译,创建发行版特定的配置文件,创建安装前和安装后脚本等任务。

换句话说,所有驴工作都已在软件包中完成,而如果您选择从源代码安装,则需要自己完成。

在几乎所有情况下,使用软件包都更加容易,因为:

  • 它们更容易安装
  • 它们是专门为与您的发行版一起使用而设计的
  • 软件包维护者有时会修补它们,以修复特定于发行版的错误
  • 软件包管理器将卸载它们
  • 包管理器将为您管理所有依赖项
  • 包管理器将负责更新
  • 您无需在系统上安装开发人员工具(编译器,make等)

但是,有时打包版本是旧版本,甚至更糟,没有打包版本。在这种情况下,唯一的选择就是编译自己。如果这样做,则需要考虑以下事项:

  • 您需要在系统上安装所有开发人员工具
  • 您将负责检查更新并重新编译
  • 您将需要确保安装了所有依赖项,包括dev软件包-其中可能有很多。
  • 如果发行版无法正常运行,则可能需要调试问题

如果您愿意付出额外的努力,那么从源代码进行编译可能会给您带来以下好处:

  • 访问最新的可用版本
  • 优化性能/稳定性的编译过程的选项
  • 享受!

请注意,尽管某些发行版的预编译软件包提供了可以安装和运行的二进制可执行文件(例如RPM和DEB),但其他发行版提供的软件包却可以使编译过程自动化。

Gentoo ebuilds就是一个例子-软件包基本上是给软件包管理器的说明,描述了如何编译和安装可执行文件。这具有传统软件包管理器的许多优点(自动更新,卸载等),同时仍允许用户根据自己的喜好优化编译过程。

Arch Linux有一个打包系统,其中主流软件包是二进制的,而许多额外的软件包是使用PKGBUILD文件在系统上编译的。


19

除了其他答案,我还要添加一些内容:

如果您决定自己编译程序,则需要考虑编译不是只执行一次。您可能需要订阅您决定编译的应用程序的开发邮件列表,并保持最新状态,尤其是安全更新。

每次更新应用程序时,您都必须重新编译新版本,因此请记住,您每周必须节省一些时间。

如果您负担不起,最好让软件包维护者为您完成这项工作。


6

从源头构建可以指定您计算机的确切体系结构。新CPU具有编译器确实能够理解的其他指令,从而降低了性能。预先构建的软件包通常依靠仍旧使用的最古老的CPU。

对于大量使用CPU的项目关键型应用程序(例如生物信息管道工具或地球物理建模工具),这最重要。这样的软件在非常受控的环境中运行,没有单独的访问控制,因此很少有紧急的安全漏洞,因此必须在数天或数小时内对其进行修补。它几乎不需要在最初具有未知体系结构的其他计算机上运行。

是的,我知道,计算机现在非常非常快,您所做的任何努力或动作都非常非常非常昂贵,但是在等待并等待程序完成的第三天(我正在谈论的是这种情况)开始看起来有问题。

不同的是,应从维护者存储库(而不是从某些下载的预构建包)中更好地使用诸如浏览器之类的应用程序,因为使它们保持最新非常重要。


这样的调整可以最大程度地利用您的CPU会有所作为(这仅在某些非常专业的代码中才有意义;这是因为95%的时间都花在了5%的代码上,从而优化了其他95%的代码并没有明显的区别;当今的大多数程序总是有99%的时间在等待用户下定决心),程序提供了不同的代码,具体取决于启动时的CPU。
vonbrand '16

0

一种获得两全其美的方法(最新软件,简单的安装/卸载,结合大多数发行版的调整和改编,可以针对本地需求进行优化),而成本(必须保持最新,自己注意错误)和最后一刻的补丁程序,紧随开发之后,就bug修复和版本之间的不兼容性而言,您只能靠自己来解决)(很多),是从发行版的源程序包开始构建自己的程序包。是的,这不仅仅是构建和安装。


1
这似乎是一个有趣的答案(“两全其美”),但是我在这里不太明白您的意思:“是从发行版的源软件包开始构建自己的软件包”。您介意改写/解释吗?
JanŻankowski17年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.