为什么程序不以编译格式分发?

kit*_*tty 35 source make software-installation elf package-management

但他们给出的指令是

cd downloaded_program
./configure
make install
Run Code Online (Sandbox Code Playgroud)

这将创建所需的 ELF,可能还有一些 .so 文件。

为什么不把它们放在一个 zip 文件中进行下载,就像 Windows 应用程序一样?有什么理由需要用户编译它们吗?

Fac*_*tor 34

让我们分析一下这些因素...

分析

根据平台的依赖性:在开发人员创建和维护应用程序的多个特定于架构的变体的环境中会出现一些问题:

  • 不同的变体需要不同的源代码——不同的基于 UNIX 的操作系统可能使用不同的函数来实现相同的任务(例如,strchr(3) 与 index(3))。同样,可能需要为不同的变体包含不同的头文件(例如,string.h 与 strings.h)。

  • 不同的变体需要不同的构建过程——不同平台的构建过程有所不同。差异可能涉及编译器位置、编译器选项和库等细节。

  • 不同变体的构建必须保持分开——因为只有一个源代码树,所以必须小心确保一个架构的目标模块和可执行文件不会与其他架构的目标模块和可执行文件混淆。例如,链接编辑器不得尝试使用为 SunOS-4 构建的目标模块来创建 IRIX-5 可执行文件。

  • 每个操作系统都有自己的链接管理方案,必须根据需要准备 ELF(可执行和链接格式)文件。

  • 编译器会生成一个指令序列的构建,不同的架构意味着不同的指令集(指令集架构的比较)。因此,每个架构的编译器输出都是不同的(例如:x86、x86-64、ARM、ARM64、IBM Power ISA、PowerPC、摩托罗拉的 6800、MOS T 6502等等

安全

  • 如果您下载一个二进制文件,您无法确定它是否按照它所说的那样做,但是您可以尝试审核源代码并在您的系统中使用自编译的二进制文件。尽管如此,用户Techmag在他的评论中提出了一个很好的观点,审核代码需要知识渊博且有能力的编码人员来评估代码,而不是安全保证。

市场:在本节中有很多因素,但我将尝试恢复它:

  • 并非每家公司都旨在覆盖所有平台,这取决于市场和平台的受欢迎程度以及他们想要销售的产品。

  • 自由软件具有让软件尽可能广泛可用的精神,但这并不意味着软件是为每个平台设计的,它取决于支持它的社区。

结论

并非每个软件都是为每个平台设计的。为所有架构和平台提供二进制文件意味着为所有平台编译、测试和维护它。这是更多的工作,有时太昂贵了,如果用户在自己的平台上编译它可以避免。此外,用户将知道他正在执行什么。


Sly*_*ven 10

有各种各样的平台和软件环境 *nix 和其他,软件可能能够运行,允许您构建应用程序(或与应用程序一起使用的库)是唯一现实的支持方式这些组件的许多组合就像一个“好”的软件项目一样。当然,像 GPL 这样的许可证要求源代码可用——所以即使软件不能正常工作,用户通常也可以(尽管理解错误以及如何修复它可能很棘手)或一些第三方潜入并纠正它,即使创作者不会/不能/不再存在这样做。

将软件作为源代码分发还允许独立验证该软件是否按照其声称的那样做,并且不会做一些令人讨厌的事情,而不是做一些令人讨厌的事情——尽管降低了人们对创建者的信任程度,但实际上增强了它!


Gil*_*il' 9

首先,你的问题是基于一个有缺陷的前提。程序分布在编制格式!

在 Ubuntu 上安装软件的正常方法,就像在大多数其他 Linux 发行版上一样,更普遍的是在大多数 Unix 变体上,是安装一个包。在 Ubuntu 上,您打开软件中心或其他一些包管理器并浏览可用的软件。当您选择安装包时,二进制文件(如果包包含程序)将下载并安装在您的机器上。

默认情况下,包管理器为您提供分发维护者制作的包。您还可以找到第三方软件包来源;Ubuntu 提供PPA作为第三方提供软件包的标准化方式。

以编译形式从作者处下载软件是最后的手段。仅当软件不够流行而无法打包时,或者您绝对需要尚未打包的最新版本时,您才需要这样做。大多数人从来不需要这样做。

当软件不是为分发而打包时,它通常以源代码形式而不是二进制形式分发。这种情况在 Linux 世界中经常发生,而在 Windows 世界中很少发生的主要原因有两个。原因之一是Linux上开源程序的比例要高得多。显然,如果程序的源代码不可用,则唯一的分发形式是二进制文件。另一个原因是 Linux 世界更加多样化。每组不兼容的库版本都需要不同的二进制文件,这通常意味着每个发行版的每个版本都有不同的二进制文件。Windows 通过让每个包作者分发他们与程序一起使用的库来“解决”这个问题(结果:您的计算机存储每个库的多个副本,每个使用它的程序一个;如果库中的错误被修复,每个使用它的程序都必须发布更新),并且每三年左右发布一个新版本的操作系统。Unix 有更多的多样性和更及时的错误修复习惯,并通过为不同的发行版构建不同的二进制文件来解决库发行版的问题。


phy*_*fox 5

Linux 运行在不止一个特定的 CPU 平台上。如果您分发 ELF 文件(或任何其他类型的原始可执行文件),则某些版本的 Linux 可能无法运行该软件。本着使软件尽可能广泛可用的精神,首选使用源代码。例如,Linux 运行在 Sparc、Intel、AMD、ARM 和其他类型的处理器上。

例如,如果 ELF 文件专门针对英特尔处理器,则其他类型的硬件将无法运行该软件。ELF 是独立于平台的,但它托管的代码需要符合平台的机器代码。您会注意到有多少发行版具有类似的包(例如,支持不同处理器时的 _386 和 _586 包)——您必须安装正确的 ELF 文件才能获得正确的操作。

同样,如果我决定构建一个使用不同中断、链接器等的自定义 Linux 版本,那么我仍然需要源代码来编译代码。即使源代码没有特定于平台的构建指令,每个平台都是不同的,可能不会从不同的系统运行 ELF。


rac*_*man 5

以分发为来源的最初原因当然是平台多样性;Linux 社区出于这个原因和新的部分政治原因继续采用这种方法。

与 Windows 不同,Linux 历来从不费心保持任何 ABI(应用程序二进制接口)在很长一段时间内保持稳定——保持在诸如可执行格式、库 API 和对新硬件平台的支持等方面进行创新的可能性被/被认为更多重要的。

商业操作系统通过非常严格的创新来实现长期的应用程序兼容性;一个新的特性/软件接口总是需要添加到旧的接口上——需要维护两件事,并且在发布后更改任何东西的代价都需要考虑非常高。或者,您可以与为您的操作系统编写软件的任何人一起接受计划中的应用程序过时这一事实(这不是暗示 MS,而是另一家操作系统供应商)。

Linux 社区的某些成员甚至认为,为仅以二进制形式分发的软件(在给定的 Linux 发行版之外)实现长期稳定的平台甚至是不可取的。作为这两个平台的毫无歉意的用户,我并不是说这是好是坏。它就像它一样。


Rap*_*pti 3

大多数 Linux 软件都是自由软件。通过使用一些编译指令而不是二进制文件分发源代码,您有机会在编译之前查看甚至编辑源代码。这样,您就可以非常确定该程序实际上做了什么并且它没有害处。