教程七

使用Google翻译翻译自: http://www.ee.surrey.ac.uk/Teaching/Unix/unix7.html


7.1编译UNIX软件包

我们在我们的系统上安装了许多公有领域(不受版权保护)和商业的软件包,所有这些都可提供给所有用户使用。但是,也允许学生在自己的主目录中下载并安装小型软件包,这些软件包通常只对他们个人有用。

安装软件需要多个步骤。

在上述步骤中,可能最难的是编译阶段。

编译源代码

所有高级语言代码必须转换成计算机所能理解的形式。例如,C语言源代码被转换成一种称为汇编语言的低级语言。然后将由前一级制作的汇编语言代码转换为目标代码,目标代码是计算机可以直接理解的代码片段。编译程序的最后阶段是将目标代码链接到包含某些内置函数的代码库。这个最后阶段产生一个可执行程序。

手工执行所有这些步骤是复杂的,超出了普通用户的能力。为程序员和最终用户开发了一些实用程序和工具来简化这些步骤。

make和Makefile

make命令允许程序员来管理大型程序或程序组。通过跟踪整个程序的哪些部分做了修改来帮助开发大型程序,仅编译自上次编译以来做出修改的那些部分。

make程序从Makefile文件中获取其一系列的编译规则,Makefile文件通常和源文件驻留在同一目录中。它包含有关如何编译软件的信息,例如优化级别,是否在可执行文件中包含调试信息等。它还包含了在何处安装编译后的二进制文件(可执行文件),手册页,数据文件,依赖库文件,配置文件等的信息。

某些包需要您手动编辑Makefile来设置最终的安装目录或其​​他的参数。但是,现在许多软件包使用GNU configure实用程序的方式进行分发。

configure实用程序

随着UNIX变体的数量的增加,编写可运行在所有变体上的程序变得更加困难。开发人员经常无法访问每个系统,并且特性也随着系统的版本的变化而变化。GNU configure配置和构建系统简化了作为源代码分发的程序的构建。所有程序都采用了简单、标准化的两步过程构建。程序构建器不需要安装任何专用工具来构建程序。

configure shell脚本试图猜测编译过程中使用的各种系统相关的变量的正确值。它使用这些值在包的每个目录中创建一个Makefile

编译包的最简单的方法是:

  1. cd到包含源代码的目录。
  2. 键入./configure执行相应系统的配置。
  3. 键入make来编译包。
  4. (可选过程)键入make check以运行该包附带的自检。
  5. 键入make install安装程序、数据文件和文档。
  6. (可选过程)键入make clean从源代码目录中删除程序编译过程中生成的二进制文件和对象文件

configure实用程序支持各种选项。通常可以使用--help选项获取特定配置脚本的选项列表。

您可能使用的唯一通用选项是--prefix--exec-prefix选项。这些选项用于指定安装目录。  

--prefix选项命名的目录将保存独立于机器的文件,如文档,数据和配置文件。

--exec-prefix选项命名的目录(通常是--prefix目录的子目录)将保存与机器相关的文件,例如可执行文件。

7.2下载源代码

在这个例子中,我们将下载一个可以在不同测量单位之间进行转换的免费软件。

首先创建一个下载目录 

%mkdir download

这里下载软件并将其保存到新的下载目录。

7.3提取源代码  

进入您的download目录并列出内容。 

%cd download
%ls -l

你可以看到,文件名以tar.gz结尾。tar命令将多个文件和目录转换为单个tar文件。然后使用了gzip命令压缩(创建一个tar.gz文件)。

首先使用gunzip命令解压缩文件。这将创建一个.tar文件。 

%gunzip units-1.74.tar.gz

然后提取tar文件的内容。

%tar -xvf units-1.74.tar

再次列出download目录的内容,然后转到units-1.74子目录。

%cd units-1.74

7.4配置和创建Makefile  

首先要仔细阅读READMEINSTALL 文本文件(使用less命令)。这些文件包含有关如何编译和运行软件的重要信息。

units包使用GNU configure配置和编译源代码。我们需要指定安装目录,因为默认安装目录是您不具有写入权限的主系统区域。我们需要在您的主目录中创建一个安装目录。  

%mkdir ~/units174

然后运行configure实用程序设置安装路径。 

%./configure --prefix = $HOME/units174

注意:$HOME变量是环境变量的示例。$HOME的值是您的主目录的路径。只需输入

%echo $HOME

即可显示此变量的内容。我们将在后面的章节中更多地了解环境变量。

如果configure正确运行,它将创建一个包含所有必需选项的Makefile。如果您愿意,可以查看Makefile(使用less命令),但不要编辑此内容。

7.5编译软件包

现在,您可以通过运行make命令来继续构建软件包。 

%make

一两分钟(取决于计算机的速度)后,完成可执行文件的编译。您可以通过键入下面的命令来查看所有编译成功的内容

%make check

如果一切顺利,您现在可以安装软件包。  

%make install

这将把文件安装到您之前创建的~/units174目录中。

7.6运行软件

您现在可以运行该软件(假设一切正常)。 

%cd ~/units174

如果列出units目录的内容,您将看到一些子目录:

bin 包含了二进制可执行文件
info 包含了GNU info格式的文件
man 包含了手册页
share 包含了共享的数据文件

要运行程序,请转到bin目录并键入 

%./units

例如,将6英尺转换成米。 

You have: 6 feet
You want: metres 

* 1.8288

如果你得到答案1.8288,恭喜,程序工作正常。

要查看可以转换的单位,请查看共享目录中的数据文件(列表相当全面)。

要阅读完整的文档,请转到info目录并输入 

%info --file=units.info

7.7剥离不必要的代码

当开发一个软件时,程序员将调试信息包含在生成的可执行文件中是有用的。这样,如果运行可执行文件时遇到问题,程序员可以将可执行文件加载到调试软件包中,并追踪任何软件错误。

这对程序员是有用的,但对用户来说是不必要的。我们可以认为,一旦开发完成并可用于下载,软件包已经过测试和调试。但是,当我们编译上面的软件时,调试信息仍然被编译到最终的可执行文件中。由于我们以后不太可能需要这个调试信息,所以我们可以从最终的可执行文件中删除它。其优点之一是可执行程序要小得多,会稍微快一些。

我们要做的是查看前后两个二进制文件的大小。首先切换到units安装目录下的bin目录。 

%cd ~/units174/bin
%ls -l

您可以看到,该文件的大小超过100千字节。您可以使用file命令获取有关文件类型的更多信息。 

%file units

units: ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked (uses shared libs), not stripped

要剥离二进制文件中的所有调试和行编号信息,请使用strip命令 

%strip units
%ls -l

如您所见,该文件现在是36千字节,是其原始大小的三分之一。二进制文件的三分之二是调试代码!

再次检查文件信息。 

%file units

units: ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked (uses shared libs), stripped

有时您可以在安装软件包时使用make安装所有二进制文件的预先剥离调试数据的副本。只需键入make install-strip而不是make install