UNIX教程七
7.1编译UNIX软件包
我们有许多公共领域和商业软件包安装在我们的系统上,这是所有用户都可用。
安装软件需要多个步骤。
- 找到并下载源代码(通常是压缩的)
- 打开源代码包
- 编译代码
- 安装生成的可执行文件
- 设置安装目录的路径
在上述步骤中,可能最困难的是编译阶段。
编译源代码
所有高级语言代码必须转换为计算机可以理解的形式。例如,C语言源代码被转换为称为汇编语言的低级语言。然后将由前一级产生的汇编语言代码转换为目标代码,该目标代码是计算机直接理解的代码片段。编译程序的最后阶段包括将目标代码链接到包含某些内置函数的代码库。这个最后阶段产生可执行程序。
手工完成所有这些步骤是复杂的,超出了普通用户的能力。已经为程序员和终端用户开发了许多实用程序和工具以简化这些步骤。
make和Makefile
make命令允许程序员来管理大型程序或程序组。它通过跟踪整个程序的哪些部分已经被改变,仅编译自上次编译以来已经改变的程序的那些部分来帮助开发大程序。
make程序从名为Makefile的文本文件中获取其设定的编译规则,该文件与其源文件在同一目录中。它包含有关如何编译软件的信息,例如优化级别,是否在可执行文件中包含调试信息。它还包含有关在哪里安装完成的编译二进制文件(可执行文件),手册页,数据文件,依赖库文件,配置文件等的信息。
一些软件包要求您手动编辑Makefile以设置最终的安装目录和任何其他参数。但是,现在许多软件包都随GNU configure实用程序一起分发。
配置
随着UNIX变体数量的增加,编写可以在所有变体上运行的程序变得更加困难。开发人员经常无法访问每个系统,并且一些系统的特性从版本更改为版本。GNU配置和构建系统简化了作为源代码分发的程序的构建。所有程序都使用简单,标准化,两步过程构建。程序构建器不需要安装任何特殊工具来构建程序。
该configure的shell脚本试图猜测编译过程中使用的各种系统相关的变量的正确值。它使用这些值在包的每个目录中创建一个Makefile。
编译包的最简单的方法是:
- cd到包含包的源代码的目录。
- 键入./configure以配置系统的软件包。
- 键入make以编译包。
- (可选)键入make check以运行包随附的任何自检。
- 键入make install安装程序和任何数据文件和文档。
- (可选)键入make clean以从源代码目录中删除程序二进制文件和对象文件
configure实用程序支持各种选项。通常可以使用--help选项获取特定配置脚本的有趣选项列表。
常用的通用选项是--prefix 和--exec-prefix选项。这些选项用于指定安装目录。
由--prefix选项命名的目录将保存机器独立文件,例如文档,数据和配置文件。
由--exec-prefix选项(通常是--prefix目录的子目录)命名的目录将保存机器相关文件,如可执行文件。
7.2下载源代码
首先创建一个下载目录
% mkdir download
7.3提取源代码
进入您的download目录并列出内容。
% cd download
% ls -l
首先使用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
第一件事是仔细阅读README和INSTALL 文本文件(使用less命令)。这些包含有关如何编译和运行软件的重要信息。
单元包使用GNU configure系统来编译源代码。我们将需要指定安装目录,因为默认将是您将不具有写入权限的主系统区域。我们需要在主目录中创建一个安装目录。
%mkdir ~/units174
然后运行configure实用程序设置此安装路径。
%./configure --prefix=$HOME/units174
注意:$ HOME变量是环境变量的示例。$ HOME的值是您的主目录的路径。只需键入
%echo $ HOME
以显示此变量的内容。我们将在后面的章节中更多地了解环境变量。
如果configure已正确运行,它将创建一个包含所有必需选项的Makefile。你可以查看Makefile如果你愿意(使用less命令),但不要编辑此内容。
7.5构建包
%make
一两分钟后(取决于计算机的速度),将创建可执行文件。您可以通过键入来查看已成功编译的内容
%make check
如果一切正常,您现在可以安装软件包。
%make install
这将把文件安装到您之前创建的〜/ units174目录中。
7.6运行软件
您现在可以运行该软件(假设一切正常)。
%cd ~/units174
如果列出units目录的内容,您将看到一些子目录。
bin | 二进制可执行文件 |
info | GNU信息格式的文档 |
man | 手册页 |
share | 共享数据文件 |
要运行程序,请切换到bin目录并键入
% ./units
例如,将6英尺转换为米。
You have: 6 feet
You want: metres
* 1.8288
如果你得到的答案1.8288,软件成功工作。
要查看它可以转换的单位,查看共享目录中的数据文件(列表是相当全面的)。
要阅读完整的文档,请转到info目录和type。
%info --file=units.info
7.7删除不必要的代码
当一个软件正在开发时,程序员可以将调试信息包括在生成的可执行文件中是有用的。这样,如果在运行可执行文件时遇到问题,程序员可以将可执行文件加载到调试软件包中并跟踪任何软件错误。
这对于程序员是有用的,但对用户不必要。我们可以假定,一旦完成并可以下载的包已经被测试和调试。然而,当我们编译上面的软件时,调试信息仍然被编译成最终的可执行文件。因为它是unlikey,我们将需要这个调试信息,我们可以从最终的可执行文件。这个的优点之一是小得多的可执行文件,应该运行得更快。
我们要做的是查看二进制文件的前后大小。首先切换到bin目录下的单元安装目录。
%cd ~/units174/bin
%ls -l
正如你可以看到,该文件的大小超过100千字节。您可以使用file命令获取有关文件类型的更多信息。
%file units
单位:ELF 32位LSB可执行,Intel 80386,版本1,动态链接(使用共享库),不剥离
要从二进制文件中除去所有调试和行编号信息,请使用strip命令
%strip units
%ls -l
如您所见,该文件现在是36 KB - 原始大小的三分之一。三分之二的二进制文件是调试代码!
再次检查文件信息。
%file units
单位:ELF 32位LSB可执行,Intel 80386,版本1,动态链接(使用共享库),剥离
有时,您可以使用make命令在安装软件包时安装所有二进制文件的预剥离副本。而不是键入make install,只需键入make install-strip