构建 Linux 音频应用程序 101:用户指南,第 1 部分

作者:Dave Phillips

最近我收到一些邮件,询问如何从源代码包构建 Linux 音频应用程序的简要说明。你们问,我就给你们解答,因此有了下面这个为困惑者、迷惑者和完全摸不着头脑的人准备的简单指南。编译软件绝非火箭科学,如果像我这样的老吉他手都能做到,那么你们肯定也能做到。

本教程是为已经了解 Linux 并且知道如何使用 Linux 系统的用户和开发者编写的。我将演示如何使用几乎每个 Linux 版本通用的免费工具和实用程序将源代码转换为软件。我们将专注于音频处理软件的开发。Linux 拥有强大的音频应用程序开发者基础设施,我希望这里提供的材料能够帮助新手和经验丰富的开发者,当他们冒险进入为音乐和声音编程 Linux 的世界时。

主流 Linux 发行版往往在程序版本方面有些保守。发行版维护者希望他们的产品使用稳定且经过验证的版本,这是可以理解的。奇怪的是,尽管人们都在谈论 Linux 只是为程序员准备的,但主流发行版的目标却明确地针对桌面用户。因此,许多流行的发行版不包含程序 X 或实用程序 Z 的最新版本。在 Linux 中,经常发生的情况是,最新的版本也是最不受支持的版本。主流 Linux 发行版可能没有应用程序所需的依赖项或特定版本的依赖项,这使得用户可以做三件事之一:您可以等到发行版在其软件包存储库中获取所需的程序,您可以寻找其他方法来完成这项工作,或者您可以尝试自己构建软件。

最后一个选项是本文的重点。专业的开发者不太可能需要这里提供的建议,但许多其他用户想知道他们如何从源代码包编译和安装 Linux 声音和音乐软件。这个过程本身并不困难,但对于新手来说,设置 Linux 软件开发系统通常令人困惑(甚至对于不太新手的人来说也是如此,尤其是当他们来自更以 GUI 为主的环境时)。本教程将帮助您确定您需要哪些工具,如何获取它们,以及如何使用它们来构建和安装 Linux 音频程序。但首先,让我们回顾一下您可能想要自己构建软件的原因。


为什么要编译?

在 Linux 的远古时代,预构建的软件包很少,因此您需要知道如何编译您想要使用的软件。书籍和其他文档经常引导用户完成编写测试程序并在命令提示符下编译它的过程。顺便说一句,“编译”、“构建”和“制作”都意味着大致相同的事情,这些术语在本教程中可以互换使用。像我这样的老用户有时可能会怀旧地谈论那些遥远的岁月,但实际上我全心全意地支持现代 Linux 发行版及其软件包存储库。自旧时代以来,构建软件的过程并没有太大变化,但该过程的某些方面已经变得更容易处理。例如,我不再需要编译 GTK 和 Qt 图形工具包,发行版升级通常会将这些组件更新到可接受的版本。

主流发行版很可能会及时更新主要软件开发工具的版本,例如 Gnu C 编译器 (GCC) 和已经提到的图形工具包。然而,它们对于某些尖端 Linux 音频软件所需的某些组件不太勤奋。由于对稳定性的担忧,主要发行版也不太可能为某些应用程序的最新版本提供软件包,也不会通常提供 alpha 或 beta 阶段开发版本的软件包。例如,如果您想测试 Ardour3,您将需要(至少)GTK2 图形工具包、libsndfile、JACK、ALSA 和 Scons 构建管理器的当前版本库和开发包。

这就引出了我们编译的 главная причина,即访问尚未在公开发行版中找到的功能和特性。从源代码构建软件还可以确保“最适合”您的系统硬件。您可能想要一个更精简的程序版本,或者您可能需要一个发行版版本可用的功能,但通常不会编译到其中。您也可能会发现该程序目前在打包版本中不可用,因此如果您想要它,您必须自己构建它。最后,您可能是那些只想了解这些奇怪事物的人之一,而且您不害怕自己动手。


IDE?什么 IDE?

我特意避免讨论任何基于 GUI 的工具。Linux 上有一些非常好的基于 GUI 的开发工具和实用程序,但就目前而言,我选择将目标定位于编程环境的最低公分母,即 Linux 命令行(又名终端提示符)。无论风格、大小或形状如何,所有 Linux 发行版都包含对系统的命令行访问。如果您从未在 Linux 控制台命令行工作过,请不要害怕:如果您可以在登录对话框中输入您的姓名,您就可以在终端提示符下输入和执行命令。力量掌握在您手中。


一分钟构建指南

构建软件的整个过程可以概括为以下步骤

  1. 下载并解压源代码。
  2. 编译源代码以创建程序。
  3. 安装程序。

第二步包括几个子阶段

  • 配置源代码,以实现生成程序的最佳性能。
  • 将源代码文件 (*.c) 编译为目标文件 (*.so)。
  • 将目标文件链接在一起,形成可执行二进制文件,即可用程序。

就是这样,它真的就这么简单。当然,我忽略了出错的可能性,并且一些指示的阶段可能需要一些额外的步骤才能使过程顺利完成。我将在本教程的后面部分解决这些问题,但现在我们将继续描述您需要哪些工具才能从源代码包中制作一个可工作的程序。


通用环境

在其原始状态下,软件是文件的集合,称为程序的源代码。通常,源代码由一个或多个简单 ASCII 文本格式的文件组成,以计算机语言编写,例如 C/C++、Python、Lisp、Java... 列表还在继续。计算机编程语言都能够做同样的事情,但它们并非都具有同等的能力。因此,某些语言比其他语言更适合某些用途。C 语言恰好是系统软件和其他性能关键型软件的绝佳选择,例如为实时管理音频数据而编写的程序。大多数 Linux 音频软件都是用 C 或 C++ 编写的,因此本文的其余部分主要关注编译用 C 编写的源代码。

以下示例是 C 编程语言编写的旧标准源代码块的变体

  #include <stdio.h>

  int main()
  {
    printf("Greetings, Earthlings !\n");
    exit(0);
  }

将此代码转换为可工作的程序后,您可以运行它并观看它在屏幕上打印消息“Greetings, Earthlings!”。但是,要将该源代码转换为实际执行某些操作的程序,我们需要获取一些专门为应用程序开发而设计的工具和实用程序。这些工具构成了所谓的构建环境。

大多数主流发行版都提供一个名为 build-essential(或类似名称)的软件包,它将添加用于编译的基本工具,包括 GNU 编译器套件,这是一组编译器和其他实用程序,用于构建用 C/C++ 编写的软件(用其他语言编写的软件将需要它们自己的编译器)。您还需要一个构建管理系统,例如 Scons 或 GNU autotools。

为了防止您不知道:编译器是一个专门的程序,它从源代码中生成一个可工作的程序。它是如何做到的超出了本文的范围,因此我将引导读者访问有争议的 Wikipedia 上关于编译器的页面,以开始他们的调查。

在我们构建任何源代码之前,我们需要检索一些源代码。可以从 Web 或 ftp 站点通过正常下载获取软件包。然而,前沿软件通常根本没有打包,尽管每日构建的 tarball 可能会提供。您可能需要一些工具,例如 cvs(控制版本系统)、svn(SubVersion 系统)以及 githg 系统,所有这些都应该可以从您的发行版的软件存储库中获得。这些检索实用程序访问称为版本控制系统的特殊受监管的源代码存储库,它们的使用通常需要像以下 Ardour2“正在进行”源代码树的源代码请求这样的神秘命令语法

    svn co http://subversion.ardour.org/svn/ardour2/branches/2.0-ongoing

此命令访问 Subversion (svn) 存储库,并从 Ardour 开发团队的 2.0-ongoing 目录中检出源代码。将在目标机器上创建一个相同的目录,并且软件将逐个文件地交付到该目录,并在传输结束时显示修订号。可以使用另一个特殊命令执行更新,或者可以重复使用正常的检出命令(仅传输更新的文件)。

从 CVS 存储库检索的命令与上面的 SVN 示例类似。以下示例演示了访问 Csound 的 CVS 源代码所需的 2 步过程

    cvs -d:pserver:anonymous@csound.cvs.sourceforge.net:/cvsroot/csound login (Press the Enter key to login anonymously.)

    cvs -z3 -d:pserver:anonymous@csound.cvs.sourceforge.net:/cvsroot/csound co -P csound5 

同样,将创建一个新的 csound 目录,因此请务必将其放在您想要找到它的位置。$HOME/src 对我来说效果很好。

不同的开发者喜欢不同的版本控制系统。您需要查看您选择的程序的网站,以获取其选择的版本控制存储库的正确 URL。


这么多软件包

如果您以正常方式下载软件包,您将需要解压并安装其内容。存在各种软件包格式,因此让我们看看一些常用的用于源代码软件包的格式。

一开始是 tarball,它很好。tar 实用程序将目录组织成一个文件,然后通常使用文件压缩实用程序对其进行压缩。以下示例演示了如何解压缩使用这些工具创建的 tarball

    tar -xZvf foo.tar.Z

    tar -xzvf foo.tar.gz

    tar -xjvf foo.tar.bz2

其中

  • x 设置解压缩,
  • v 运行解压缩文件的详细列表,
  • f 表示解压缩将来自文件,
  • Z、z、j 确定要部署哪个压缩/解压缩实用程序。

顺便说一句,“tar”代表“磁带存档”,指的是数字数据存储在磁带上的日子。文件名扩展名的最后一部分标识用于压缩文件的实用程序。Z 指的是 UNIX compress 实用程序,gz 表示使用了 GNU gzip,而 bz2 扩展名指的是最近的压缩格式。

tarball 仍然是源代码的首选分发格式,但您也可能会遇到 DEB (Debian)、RPM (RedHat/Fedora 和 OpenSUSE)、RAR、Windows ZIP 和其他格式的源软件包。这些格式中的每一种都执行与 tarball 相同的基本软件包功能,它们的基本解包命令如下

    dpkg -i foo.deb

    rpm -uVh foo.rpm

    unzip foo.zip

    rar e foo.rar

    7z l foo.7z

包含 RAR 和 7z 仅仅是为了完整性。这些格式在 Linux 上相对不常见,通常与大型 soundfont 和音频样本集合相关联。

源代码也可以在特殊的 RPM 和 DEB 软件包中获得。这些软件包可以通过其软件包管理工具在一个简单的过程中解包和编译,但该过程缺少用户输入的配置阶段。正如我们将看到的,这种预构建配置是构建序列的重要组成部分,如果您想要完全控制该过程,则不应跳过该配置。

警告:有时您会发现格式错误的软件包,例如将其所有解压缩的文件转储到活动目录中的软件包,即该软件包没有创建自己的顶级目录。在解压缩软件包之前,始终明智的做法是使用内容视图选项 (tar -t foo.package) 检查软件包组织。如果没有指示父目录,您将需要创建一个父目录以指定解压缩目标。务必将软件包移动到新目录中,然后在那里解压缩它。


构建管理器

好的,您已经下载了一些源代码,并且您已准备好编译它。在您可以这样做之前,您需要一组工具来帮助您完成配置过程并管理编译器与源代码的交互。传统的 Linux 工具链包括 GNU autotools(automake、autoconf 和 libtool),但其他流行的实用程序包括 Sconscmake 系统、premake 和最近的 waf 工具。使用 Qt 图形库构建的软件通常需要运行 qmake 实用程序,然后使用 GNU autotools 的 make 工具。


关于依赖项

依赖项是编译目标软件包绝对需要的软件包。系统依赖项包括内核头文件、X11 库和头文件以及 GTK 和 Qt 等图形工具包。库本身不足以构建软件,您还需要安装所有必需库的开发包。

Linux 音频应用程序有一些特定依赖项,这些依赖项在各种程序中都很常见。您可以期望看到对 ALSAJACK 库和头文件、用于 soundfile I/O 的 libsndfile 库以及 LADSPALV2 插件系统的开发包的要求。其他不太关键的软件包包括 librdf(插件元数据)、liblo(用于 OSC 功能的库)、libfftw3(快速傅里叶变换库)、Ogg/Vorbis 库(用于 OGG 文件支持)和 liblame(MP3 支持)。


结尾,第 1 部分

在我的下一篇文章中,我们将完成构建过程。请尽快再次查看最终篇。

加载 Disqus 评论