任何人都可以通过这三个简单步骤编译开源代码

你不需要知道如何编写或阅读代码来编译它。
65 位读者喜欢这篇文章。
3 cool machine learning projects using TensorFlow and the Raspberry Pi

Opensource.com

安装软件有很多方法,但使用开源软件,你可以获得其他方式无法提供的选项:你可以自己编译代码。编译源代码的经典三步流程

$ ./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. 下载源代码
  2. 解压源代码 
  3. 编译

你已经拥有了所有需要的命令,现在你需要一些软件来编译。

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

编译代码

我编译了我自己的大部分应用程序,无论是在我的 Slackware 桌面计算机上还是在我的 CentOS 笔记本电脑上使用 NetBSD 的 pkgsrc 系统。我发现通过自己编译软件,我可以根据自己的意愿来决定应用程序中包含的功能、它的配置方式、它使用的库版本等等。这很有意义,它帮助我跟上新版本的步伐,而且因为我有时会在这个过程中发现错误,所以它帮助我参与到许多不同的开源项目中。

你很少会别无选择,只能编译软件。大多数开源项目都同时提供源代码(这就是它被称为“开源”的原因)和可安装的软件包。从源代码编译是你自己可以选择的一种方式,可能是因为你想要最新版本中尚未提供的新功能,或者仅仅是因为你更喜欢自己编译代码。

家庭作业

Angband 可以使用 Autotools 或 Cmake,所以如果你想体验另一种构建代码的方式,请尝试这样做

$ mkdir build
$ cd build
$ cmake ..
$ make
$ sudo make install

你也可以尝试使用 LLVM 编译器而不是 GNU C 编译器进行编译。现在,我将把它作为一个练习留给你自己去研究(提示:尝试设置 CC 环境变量。)

一旦你完成了对 Angband 源代码的探索以及至少几个地牢的探索(你已经赢得了一些休息时间),请查看其他一些代码库。许多将使用 Autotools 或 Cmake,而另一些可能使用不同的东西。看看你能构建什么!

接下来阅读什么

放弃 Autotools,选择 CMake

CMake 是一个跨平台套件,用于构建、测试和打包软件,即使你以前从未使用过构建系统,它也很容易使用。

(团队,红帽)
2021 年 5 月 14 日
标签
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。他曾在电影和计算机行业工作,而且经常同时工作。

2 条评论

我在编译 Scribus 时发现,实际上没有必要输入“make”,然后再输入“make install”。
你可以通过“make install”来完成所有这些操作,因为它似乎做的第一件事是检查代码是否已编译,如果尚未编译,则会进行编译。

对于学生初学者来说是很棒的资源 - 谢谢。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.