欢迎访问我的个人博客: luomuxiaoxiao.com
上篇文章我们讲过,我们写出来的C文件属于文本文件,属于高级语言,而计算机只能理解特定的二进制的文件,那么怎么把文本文件翻译成计算机可以理解的二进制文件呢?
下面我们以C语言中经典的“hello, world”的编译为例来说明。为了详细观察编译过程,我们使用下面的环境来详细的研究这个过程:
- ubuntu 64位操作系统
- gcc作为编译工具
(版本信息:gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.10))
注:后续如未特殊说明,本系列所有文章都使用上述环境作为实验环境。
首先创建C文件名为hello.c
,其内容如下:
1 #include <stdio.h>
2
3 int main()
4 {
5 printf("hello, world\n");
6 return 0;
7 }
一、预处理
这个阶段中将代码文件中以#
开头的代码扩展开来,比如,以“#include ...”
形式包含的头文件、“#define ...”
定义的宏,"#ifdef ... #endif"
包含的代码,同时删除掉代码文件中的注释。
1.1 预处理命令
gcc -E hello.c -o hello.i
我们可以看到当前文件夹中生成了hello.i
的文件。
1.2 生成文件格式
使用file
命令查看生成的文件:
$ file hello.i
hello.i: C source, ASCII text
注意:和Windows不一样,Linux文件的后缀名并不会决定其文件的类型,后缀只是一个标志而已。如果要查看文件的类型,需要用**
file
**命令。
显然,hello.i
文件依然是一个C文件,是一个由ASCII字符组成的文本文件。
使用文本编辑器打开hello.i
可以看到,最下面的代码就是上述hello.c
文件中的第3行到第7行代码。这部分代码上面插入了按照上述预处理的规则处理之后stdio.h
的代码。
二、编译
2.1 编译命令
gcc -S hello.i -o hello.s
我们得到一个hello.s
文件。
2.2 生成文件格式
使用file
命令查看文件的格式:
想第一时间查看我的文章吗?请关注我的微信公众号号,搜索“落木萧萧技术论坛”或登陆我的个人博客:www.luomuxiaoxiao.com,更多精彩文章等你。
![qrcode](https://i-blog.csdnimg.cn/blog_migrate/18761891c55b2bfa97548506179f7601.jpeg)