安装软件有很多方法,但使用开源软件,你可以获得其他方式无法提供的选项:你可以自己编译代码。编译源代码的经典三步流程
$ ./configure
$ make
$ sudo make install
感谢这些命令,你可能会惊讶地发现,你不需要知道如何编写甚至阅读代码也能编译它。
安装构建软件的命令
由于这是你第一次编译,所以需要一个一次性的准备步骤来安装构建软件的命令。具体来说,你需要一个编译器。编译器(例如 GCC 或 LLVM)将如下所示的源代码转换为
#include <iostream>
using namespace std;
int main() {
cout << "hello world";
}
机器语言,即 CPU 用于处理信息的指令。你可以查看机器代码,但你不会明白它的意思(除非你是 CPU)。
你可以使用你的软件包管理器在 Fedora、CentOS、Mageia 和类似发行版上获取 GNU C 编译器 (GCC) 和 LLVM 编译器,以及其他用于编译的必要命令
$ sudo dnf install @development clang
在 Debian、Elementary、Mint 和类似发行版上
$ sudo apt install build-essential clang
设置好系统后,每次想要编译软件时,都需要重复执行以下几个任务
- 下载源代码
- 解压源代码
- 编译
你已经拥有了所有需要的命令,现在你需要一些软件来编译。
1. 下载源代码
获取应用程序的源代码与获取任何可下载的软件非常相似。你可以访问网站或代码管理站点,如 GitLab、SourceForge 或 GitHub。通常,开源软件既有正在进行中的(“current”或“nightly”)形式,也有打包好的“stable”发布版本。尽可能使用稳定版本,除非你有理由相信其他版本更好,或者你精通代码,可以在出现问题时修复它们。术语stable 表示代码经过了测试,并且应用程序的程序员对代码有足够的信心,可以将其打包到 .zip
或 .tar
存档中,给它一个正式的编号,有时还会给它一个发布名称,并提供给普通的非程序员公众下载。
在本练习中,我将使用 Angband,一个开源 (GPLv2) ASCII 地牢爬行游戏。它是一个简单的应用程序,但具有足够的复杂性,可以演示自行编译软件时需要考虑的事项。
从网站下载源代码。
2. 解压源代码
源代码通常以存档形式交付,因为源代码通常由多个文件组成。你必须先解压它才能与之交互,无论是 tarball、zip 文件、7z 文件还是其他任何文件。
$ tar --extract --file Angband-x.y.z.tar.gz
解压后,将目录更改为解压后的目录,并四处查看。目录的顶层通常有一个 README
文件。理想情况下,此文件包含有关编译代码所需执行操作的指南。README
通常包含有关代码以下重要方面的信息
- 语言: 代码使用的语言(例如,C、C++、Rust、Python)。
- 依赖项: 系统上需要安装哪些其他软件才能构建和运行此应用程序。
- 说明: 构建软件所需的实际步骤。有时,它们会将此信息包含在一个直观地命名为
INSTALL
的专用文件中。
如果 README
文件不包含该信息,请考虑向开发人员提交错误报告。你不是唯一需要源代码入门的人。无论他们的经验多么丰富,每个人对他们从未见过的源代码都是新手,文档非常重要!
Angband 的维护人员链接到在线说明来描述如何编译代码。该文档还描述了你需要安装的其他软件,尽管它并没有明确说明。该网站说:“有几种不同的前端可以选择构建(GCU、SDL、SDL2 和 X11),可以使用配置参数,例如 --enable-sdl
、--disable-x11
等。” 这对你来说可能意味着什么,也可能看起来像一门外语,但这是你在经常编译代码后会习惯的东西。无论你是否理解 X11 或 SDL2 是什么,它们都是你在几个月内定期编译代码后经常看到的两个要求。你会习惯大多数软件都需要其他软件库的想法,因为它们建立在其他技术之上。不过,在这种情况下,Angband 非常灵活,无论是否使用这些可选依赖项都可以编译,因此现在,你可以假装没有其他依赖项。
3. 编译代码
构建代码的规范步骤是
$ ./configure
$ make
$ sudo make install
这些是使用 Autotools 构建的项目的步骤,Autotools 是一个为标准化源代码交付方式而创建的框架。但是,存在其他框架(例如 Cmake),它们需要不同的步骤。当项目偏离 Autotools 或 Cmake 时,它们往往会在 README
文件中警告你。
配置
Angband 使用 Autotools,所以是时候编译代码了!
在 Angband 目录中,首先运行源代码中包含的配置脚本
$ ./configure
此步骤扫描你的系统以查找 Angband 正确构建所需的依赖项。有些依赖项非常基本,以至于你的计算机没有它们就无法运行,而另一些依赖项则是专门的。在此过程结束时,脚本会为你提供一份关于它找到的内容的报告
[...]
configure: creating ./config.status
config.status: creating mk/buildsys.mk
config.status: creating mk/extra.mk
config.status: creating src/autoconf.h
Configuration:
Install path: /usr/local
binary path: /usr/local/games
config path: /usr/local/etc/angband/
lib path: /usr/local/share/angband/
doc path: /usr/local/share/doc/angband/
var path: (not used)
(save and score files in ~/.angband/Angband/)
-- Frontends --
- Curses Yes
- X11 Yes
- SDL2 Disabled
- SDL Disabled
- Windows Disabled
- Test No
- Stats No
- Spoilers Yes
- SDL2 sound Disabled
- SDL sound Disabled
该输出的某些部分对你来说可能有意义,有些部分可能没有意义。无论哪种方式,你可能会注意到 SDL2 和 SDL 被标记为 Disabled
,而 Test 和 Stats 都被标记为 No
。尽管是负面的,但这不一定是坏事。这本质上是 Warning 和 Error 之间的区别。如果配置脚本遇到任何会阻止它构建代码的东西,它会用错误提醒你。
如果你想稍微优化你的构建,你可以选择解决这些负面消息。通过搜索 Angband 文档,你可能会认为 Test 和 Stats 实际上对你没有意义(它们是开发人员选项,Angband 特有的)。但是,通过一些在线研究,你可能会发现 SDL2 将是一个不错的功能。
要在编译代码时解决依赖项问题,你需要安装缺少的组件以及该缺少组件的开发库 。换句话说,Angband 需要 SDL2 才能播放声音,但它需要 SDL2-devel
(在 Debian 系统上称为 libsdl2-dev
)才能构建。使用你的软件包管理器安装两者
$ sudo dnf install sdl2 sdl2-devel
再次尝试配置脚本
$ ./configure --enable-sdl2
[...]
Configuration:
[...]
- Curses Yes
- X11 Yes
- SDL2 Yes
- SDL Disabled
- Windows Disabled
- Test No
- Stats No
- Spoilers Yes
- SDL sound Disabled
- SDL2 sound Yes
Make
配置完成后,运行 make
命令
$ make
这通常需要一段时间,但它提供了大量的视觉反馈,因此你会知道代码正在被编译。
安装
最后一步是安装你刚刚编译的代码。安装代码没有什么神奇之处。所有发生的事情都是大量文件被复制到非常特定的目录。 无论你是从源代码编译还是运行花哨的图形安装向导,情况都是如此。由于代码将被复制到系统级目录,因此你必须具有 root(管理)权限,这可以通过 sudo
命令授予。
$ sudo make install
运行应用程序
应用程序安装完成后,你可以运行它。根据 Angband 文档,启动游戏的命令是 angband
,所以试一下
$ angband
(Seth Kenlon,CC BY-SA 4.0)

(Seth Kenlon,CC BY-SA 4.0)
编译代码
我编译了我自己的大部分应用程序,无论是在我的 Slackware 桌面计算机上还是在我的 CentOS 笔记本电脑上使用 NetBSD 的 pkgsrc 系统。我发现通过自己编译软件,我可以根据自己的意愿来决定应用程序中包含的功能、它的配置方式、它使用的库版本等等。这很有意义,它帮助我跟上新版本的步伐,而且因为我有时会在这个过程中发现错误,所以它帮助我参与到许多不同的开源项目中。
你很少会别无选择,只能编译软件。大多数开源项目都同时提供源代码(这就是它被称为“开源”的原因)和可安装的软件包。从源代码编译是你自己可以选择的一种方式,可能是因为你想要最新版本中尚未提供的新功能,或者仅仅是因为你更喜欢自己编译代码。
家庭作业
Angband 可以使用 Autotools 或 Cmake,所以如果你想体验另一种构建代码的方式,请尝试这样做
$ mkdir build
$ cd build
$ cmake ..
$ make
$ sudo make install
你也可以尝试使用 LLVM 编译器而不是 GNU C 编译器进行编译。现在,我将把它作为一个练习留给你自己去研究(提示:尝试设置 CC 环境变量。)
一旦你完成了对 Angband 源代码的探索以及至少几个地牢的探索(你已经赢得了一些休息时间),请查看其他一些代码库。许多将使用 Autotools 或 Cmake,而另一些可能使用不同的东西。看看你能构建什么!
2 条评论