浅谈C文件编译过程
2011-07-29 02:24
232 查看
话说总结下C文件编译过程.
首先假设有这么一段经典C程序:
首先将上述程序保存为标准的ASCII文本文件hello.c.
于是乎编译之,系统开始这么处理:
预处理器开始介入,对该文件进行预处理,也即文本替换,把#后面的一大堆替换掉,比如上面那程序中第一行的#include <stdio.h>,直接替换成原来stdio.h的内容,然后保存,现在名字变成hello.i了,于是乎编译器介入.
编译器对那hello.i进行编译,把hello.i的内容从C语言翻译成汇编语言的指令,具体怎么做的暂时先不用管,等你学了编译原理就懂了.
接着汇编器汇编上一步生成的汇编语言指令,生成二进制文件,不过只是半成品,因为他还没有链接各种文件中的函数等等,该文件为hello.o.
最后链接器将彼此有关的目标文件进行关联,比如该程序调用了printf函数,则要链接提前单独编译了的printf.o文件,在经过了种种复杂处理,这里最后才生成机器可以直接执行的二进制文件.当然实际情况往往比这还要复杂得多,这里就不作深入探究了.
C语言编译的整个过程是非常复杂的,里面涉及到的编译器知识、硬件知识、工具链知识都非常多,深入了解整个编译过程对工程师理解应用程序的编写是有很大帮助的.
首先假设有这么一段经典C程序:
#include <stdio.h> //包含标准输入输出头文件,stdio即standard input&output int main(void) //主函数,程序入口点 { printf("Hello,world!\n"); //标准库输出函数,在屏幕打印"hello world!"(不包括双引号) return 0; //函数返回0值,一切正常,程序结束 }
首先将上述程序保存为标准的ASCII文本文件hello.c.
于是乎编译之,系统开始这么处理:
预处理器开始介入,对该文件进行预处理,也即文本替换,把#后面的一大堆替换掉,比如上面那程序中第一行的#include <stdio.h>,直接替换成原来stdio.h的内容,然后保存,现在名字变成hello.i了,于是乎编译器介入.
编译器对那hello.i进行编译,把hello.i的内容从C语言翻译成汇编语言的指令,具体怎么做的暂时先不用管,等你学了编译原理就懂了.
接着汇编器汇编上一步生成的汇编语言指令,生成二进制文件,不过只是半成品,因为他还没有链接各种文件中的函数等等,该文件为hello.o.
最后链接器将彼此有关的目标文件进行关联,比如该程序调用了printf函数,则要链接提前单独编译了的printf.o文件,在经过了种种复杂处理,这里最后才生成机器可以直接执行的二进制文件.当然实际情况往往比这还要复杂得多,这里就不作深入探究了.
C语言编译的整个过程是非常复杂的,里面涉及到的编译器知识、硬件知识、工具链知识都非常多,深入了解整个编译过程对工程师理解应用程序的编写是有很大帮助的.
相关文章推荐
- 浅谈Scalable inference for Correlated Topic Models(ScaCTM)编译过程
- linux下编译c文件的过程(gcc)
- 菜鸟浅谈Linux内核编译过程...
- gcc 对c文件的编译/汇编/连接的过程的理解
- 巧用头文件,多文件编译少发愁|浅谈实用“StdAfx”|C++编译连接过程
- 浅谈Android的资源编译过程
- [置顶] 浅谈Android的资源编译过程
- 菜鸟浅谈Linux内核编译过程...
- 浅谈Android的资源编译过程
- Linux下编译C文件的过程
- UBuntu16.04下用gcc编译c文件过程详解
- UBuntu12.04下用gcc编译c文件过程详解
- 菜鸟浅谈Linux内核编译过程
- gcc 编译一个C文件的过程分析,动态链接生成
- 浅谈Android的资源编译过程
- c++运行过程编译 链接
- opencv2.0移植过程中zlib,jpeg,png库的交叉编译
- qmeu的编译过程
- Android编译系统环境初始化过程分析
- gcc编译过程