简介

自由软件和私有软件的分别在于它们对源代码的访问不同[30]。这表示自由软件以源代码文件压缩包的形式发布。初学者可能并不熟悉这种用户必须自己编译源代码才能使用自由软件的方式。

对于大部分的自由软件,存在已编译版本。性急的用户可以只安装这些预编译的二进制代码。而某些自由软件并不以这种形式发布,或者其早期版本不以二进制代码形式发布。而且,如果您使用特殊的操作系统或者特殊的硬件架构,许多软件不会特地为您事先编译好。更重要的是,亲自编译软件让您能够只启用感兴趣的选项,或者通过添加扩展为该软件扩展功能以便该程序能够确实满足您的需求。

需求

要编译软件,您需要:

  • 一台安装了能工作的操作系统的计算机,

  • 对您所使用的操作系统的基本了解,

  • 一定的磁盘空间,

  • 一个编译器(通常是 C 语言的)和一个压缩程序(tar),

  • 一些吃的(在某些困难情况下,可能持续很长时间)。一个真正的黑客会吃披萨饼 –– 而不是火腿起司蛋饼。

  • 一些喝的(同上)。一个真正的黑客喝苏打水 –– 为了提神。

  • 一位每个星期都会重新编译内核的技术迷朋友的电话号码,

  • 尤其是耐心,许多耐心!

编译源代码一般不会出现许多问题,不过如果您不习惯的话,最小的意外也可以挡住您。本文的目的就是告诉您如何解决这种问题。

编译

原则

要将源代码转换为二进制文件,必须进行编译(通常是从 CC++ 源代码,这是(UNIX®)自由软件社区最为广泛使用的语言)。某些自由软件用某些不需要编辑的语言写成(比如 perlshell),不过它们还是需要一定的配置。

C 编译过程理论上由 C 编译器完成,通常是 gcc –– 由 GNU 项目编写的自由编译器。编译一整个软件包是一项复杂的任务,由对一系列不同的源文件的编译组成(有很多原因让程序员觉得把其作品的不同部分分割到文件中更加容易)。为了简化您的工作,这些重复的工作由称为 make 的工具完成。

编译的四个步骤

为了理解编译如何工作(以便解决可能出现的问题),您需要知道其中的过程。其目的是一点一点地把一个用某种受过训练的人类才能理解的语言(比如 C 语言)写成的文本文件转换成一种机器(或者某位受过特殊训练的人类)能理解的语言。gcc 将依次执行四个程序,其中的每一个完成一个步骤:

  1. cpp:第一步将指示语句(预处理指令)替代为纯 C 指令。一般,这表示插入某个头文件(#include)或是定义宏(#define)。这一阶段结束时将生成纯 C 代码。

  2. cc1:这一步将 C 转换成汇编语言。所生成的代码依赖于目标架构。

  3. as:这一步将从汇编语言生成目标代码(或二进制代码)。这一阶段结束时将生成某个 .o 文件。

  4. ld:最后一步(链接)将所有目标文件(.o)和相关的库文件链接到一起,并生成一个可执行文件。

发行版的结构

有正确结构的自由软件发行版通常具有同样的组织:

  • INSTALL 文件描述安装步骤。

  • README 文件包含有关该程序的一般信息(简短描述、作者、获取的 URL、相关文档、有用的链接等)。如果不存在 INSTALL 文件,通常在 README 文件中会包含安装步骤简介。

  • COPYING 文件包含许可证或是发布该软件的情形。有时候该文件叫 LICENSE

  • CONTRIB 或是 CREDITS 文件包含与该软件相关人员的列表(活动的参与者、相关评论、第三方程序等)。

  • CHANGES 文件(或较为少见的 NEWS 文件)包含最近改进以及故障修正。

  • Makefile 文件(参见“Make”一节)控制该软件的编译(对 make 该文件是必需的)。如果该文件一开始不存在,那么它将由预编译配置过程生成。

  • 经常也有 configureImakefile 文件以便用户针对特殊系统自定义生成新的 Makefile 文件(参见“配置”一节)。

  • 保存源文件以及在编译结束后保存二进制文件的目录。它通常为 src

  • 保存与该程序相关文档(通常是 man 或者 Texinfo 形式)的目录,其名称常为 doc

  • 有时候,也有保存该软件特定数据(一般是配置文件、生成数据示例文件、或资源文件)的目录。



[30] 不过这也并非完全正确,因为某些私有软件也提供源代码。但是与自由软件不一样,不允许最终用户按其希望使用或修改这些代码。