标准编译安装

为什么要编译安装

包管理系统是绝大多数发行版的必备组件,也是一个发行版区别于其它发行版的主要特征。但是有些软件,并不能通过包管理系统安装,这就需要下载源码编译安装。

一个软件可能有许多功能,但是发行版中提供的安装包,通常只具有一些常见的功能。如果提供所有功能,那么无疑会占用更多的资源,而这些功能,大多数用户不会用到;而你会用到的功能,可能安装包中刚好没有。编译安装可以灵活地定制软件,选择自己需要的,取消自己不需要的。

编译安装还可以针对特定的硬件进行优化,以获得更好的性能表现。

编译环境

编译环境包括多个工具,它们环环相扣,称作编译工具链。主要包括以下工具:

工具简介
binutils连接器、汇编器和其他用于目标文件和档案的工具
gcc编译器,将源代码转换为机器代码
glibcC库,提供标准例程(C函数)
还有一些工具,能够调用工具链,实现自动化编译:
autoconf自动生成 Makefile 文件
automake自动生成 Makefile 文件
make按照 Makefile 文件中的规则编译程序

标准编译安装

首先,下载源代码,通常是压缩包,如:xxx.tar.gz 或者 xxx.tar.bz2,解包:

压缩包格式命令
.tar.gztar zxvf xxx.tgz
.tgztar zxvf xxx.tgz
.tar.bz2tar jxvf xxx.tar.bz2

通常解包后会在当前位置得到一个 xxx/ 目录,进入这个目录

cd xxx/

使用下列命令编译安装:

./configure --prefix=/opt/xxx
make
sudo make install 
make clean  
  1. configure 配置软件特性,检查编译环境,生成 Makefile文件
  2. prefix最常用配置选项:指定软件的安装路径
  3. make根据 Makefile 编译源代码
  4. install将编译完成的程序安装到系统中。通常需要 root权限
  5. clean清除源代码目录中的编译结果

编译过程

将下面代码保存为 Hello.c:

#include <stdio.h>
int main(void)
{
printf("Hello World!\n");
return 0;
}  

执行命令 cc Hello.c,得到一个可执行文件 a.out,执行它 ./a.out

可以看到,C的源代码(Hello.c)是纯文本,不能够直接执行。可执行代码是计算机的本机语言或机器语言表示的代码,这种语言是由数字代码表示的详细指令组成,不同的计算机具有不同的机器语言。

编译器是一个程序,其工作是将源代码转换为可执行代码。

  • 编译器用来将 C语言 转换成特定的机器语言。
  • 编译器还从C的库中向最终程序加入代码。
  • 编译器还检查源代码是否为有效的C语言程序。如果编译器发现错误,将报告错误,而且不生成可执行文件

编译器分三步完成这个工作:

  1. 预处理 调用预处理器 cpp 对源代码文件中的文件包含(include)、预编译语句(如宏定义 define 等) 进行分析
  2. 编译 调用编译器 cc 将源代码转换为中间代码
  3. 链接 调用链接器 ld 将中间代码与其它代码结合起来生成可执行文件

这种方法使用程序便于模块化。分别编译各个模块,然后使用链接器将编译过的模块结合起来。这样,如果需要改变一个模块,则不必重新编译所有其它模块。

可执行文件包含目标文件、库例程和启动代码

编译器将源代码转换为机器语言代码(中间代码),将结果放置在目标文件(*.o)中。虽然目标文件包含机器代码,但该文件还不能运行,它还不是一个完整的程序。

启动代码(start-up code)相当于程序和操作系统之间的接口。

库例程为函数的实现。几乎所有C程序都利用标准C库中所包含的例程,目标代码文件不包含这一函数的代码,它只包含调用函数的指令。实际代码存储在一个称为“库”的文件中。库文件中包含许多函数的目标代码

链接器的作用是将这3个元素(目标代码、系统的标准启动代码和库代码)结合在一起,并将它们存放在可执行文件中。

gcc 编译器

gcc 是 GNU 推出的功能强大、性能优越的多平台编译器,是 GNU 的代表作品之一。它能将C、C++语言源程序、汇编语言源程序和目标程序编译、链接成可执行文件,如果没有给出可执行文件的名字,gcc 将生成一个名为 a.out 的文件。

后缀类型
.cC语言源代码文件
.a由目标文件构成的档案库文件
.C|.cc|.cxxC++源代码文件
.h程序所包含的头文件
.i预处理过的C源代码文件
.ii预处理过的C++源代码文件
.mObjective-C源代码文件
.o编译后的目标文件
.s汇编语言源代码文件
.S预编译的汇编语言源代码文件

前面我们已经使用 gcc 编译了一个程序:cc Hello.c
gcc 还有许多选项:

-c 只编译,不链接成为可执行文件
-o 文件名 设定输出文件名。默认为a.out
-g 加入调试符号(默认)。1
-O 编译、链接时进行优化,耗时比较多,但产生的可执行文件执行效率更高
-O2 更高的优化级别,耗时更多

1 评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注