您的位置:首页 > 其它

【C】程序的编译与链接--简单介绍

2016-06-23 16:14 197 查看
程序由源文件编译得到可执行文件看起来好像是很简单的过程,windows的IDE环境下,点一下bulid就可以生成可执行文件,在Linux环境下,gcc编译器也提供了很多选项可以很方便的从源文件生成可执行文件。但是实际上程序的编译和链接是一个比较复杂的过程。大致可以分为四步:1.预处理;2.编译;3.汇编;4.链接。我们以最经典的hello,world程序来下面来分析一下各个步骤的作用分别是什么。

//main.c文件内容
#include<stdio.h>
int main()
{
printf(“hello,world.\n”);
return 0;
}


1. 预处理

预处理的主要作用就是处理源文件代码中以”#”开头的那些代码,比如

#include,#define等等。

将所有的宏定义全部展开。遇到被包含的文件中包含有别的文件,还会递归展开。

处理条件编译

删除所有注释

经过预编译生成的*.i文件不包含任何的宏定义。下面通过gcc来预编译main.c文件。

gcc –E main.c –o main.i



查看一下生成的main.i的文件内容,可以看到stdio.h文件内的内容已经全部被插入到文件当中了,同时所有的宏定义也被展开(main.i文件很长,截取的是一部分)。在文件的最后是我们main函数的代码。

2. 编译

编译就是将预处理得到的.i文件生成汇编代码文件(.s文件)。注意:通常所说的编译是指程序从源代码到生成可执行文件的全过程,在这里指的由.i文件生成.s文件的过程。输入下面的命令来实现编译过程,得到main.s文件。

gcc –S main.i –o main.s

main.s文件全部内容如下:



3. 汇编

汇编就是将汇编代码变成机器码。每一条汇编语句几乎都对应了一条机器码。所以这一步骤非常简单,根据汇编指令和机器指令对照表一对一翻译就OK。输入下面的指令实现这一过程。

gcc –c main.s –o main.o

此时,main.o文件已经生成,这个时候main.o已经是一个二进制文件,不能用cat查看,用hexdump来看一下main.o文件内容。



可以看到main.o文件全部都是数字。不过main.o文件还是不能执行,因为还没有把库连接进来。

4. 链接

链接就是将库文件链接到程序,库文件分为两种,一种是静态库(也成为存档文件),一种是动态库(也称为共享库)。关于静态库和动态库,请参考上一篇博文。

使用以下指令完成链接过程

gcc main.s –o main.out

生成main.out可执行文件。

以上就是从源文件到可执行文件的全部过程。这是一个很简单的范例,在main.c文件中仅包含了标准头文件,没有包含自定义的头文件,在下一篇博文中,看一个包含了自定义的头文件的程序是如何生成的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: