http://www.cnblogs.com/kekec/p/3238741.html
从源文件Hello.cpp编译链接成Hello.exe,粗略的分 可以分为 编译(compile)和链接 (link)
1.编译,由编译器对你写的代码进行词法和句法分析,发现并报告错误,有错时编译不能通过。如若无错,则生成中间代码,扩展名为obj (object code) 此时它便是二进制的了,也就是机器指令了;
一般一个工程下面,会有很多个源文件, 编译器会把每个源文件都独立的编译一哈,每一个源文件会产生一个后缀名是.obj (windows下) 或 .o (UNIX) 的文件 这个文件包含对应源文件的代码(二进制形式)
而大多数编译器都提供分离式编译每个文件的机制, 啥意思呢?
就是你如果修改了其中一个源文件,那么只需要重新编译那个改动了的源文件就ok了,让它重新生成一个.obj 文件
2.连接,在汇编里称Link,在C里叫生成,即Build,它的作用是生成可执行的exe文件。由于一个程序的源码可由多个文件组成。这些文件在第二步 中分别编译,生成各自的目标文件,这一步的作用便是将这些obj文件,以及程序中需要的其它库文件(dll除外),统一到一个文件中来,形成单个的exe 文件。此exe文件便可以在操作系统下直接运行了。
编译做完中间代码生成的工作后还有个代码优化 (还不懂)
Compile、Build分别对应编译和连接这两个过程。
debug的意思是执行,即生成了exe文件后运行它。如果你的程序有修改,点这一项它会 弹出窗口问你是否重新编译和连接,也就是它可以自动把前面的工作都做了。也就是说,vs菜单里的debug功能如下:
1.程序有修改时,或者没有做前面的编译连接工作时
debug=Compile+Build+执行;
2.程序编译连接好后
debug仅仅是执行,不再做前面两项工作。
当程序有修改时,选择Execute只重编译和连接有改动的内容,但这样做有时候会出错,这时可选择Build菜单下的Rebuild All,重新编译、连接所有文件。
总之,C程序的生成可图示如下:
编写源代码->编译->连接,也叫生成->运行
对应的各个阶段处理的文件的扩展名为:
.c或.cpp->.obj->.exe。
C程序是编译执行的,还有一种程序是解释执行的,如Java,它的源文件经过编译后形成扩展名为Class的中间代码,之后不做连接生成Exe文件,而是直接将这种.Class的中间代码拿到Java虚拟机平台上,由解释器解释执行。这种方式效率较低,但较灵活。
细致的分需要经历如下步骤:
预处理:主要是做一些代码文本的替换工作。(该替换是一个递归逐层展开的过程。)
(1)将所有的#define删除,并展开所有的宏定义
(2)处理所有的条件预编译指令,如:#if #ifdef #elif #else #endif
(3)处理#include预编译指令,将被包含的文件插进到该指令的位置,这个过程是递归的
(4)删除所有的注释//与/* */
(5)添加行号与文件名标识,以便产生调试用的行号信息以及编译错误或警告时能够显示行号
(6)保留所有的#pragma编译器指令,因为编译器需要使用它们
编译:把预处理完的文件进行一系列词法分析(lex)、语法分析(yacc)、语义分析及优化后生成汇编代码,这个过程是程序构建的核心部分。
汇编:汇编代码->机器指令。
链接:这里讲的链接,严格说应该叫静态链接。多个目标文件、库->最终的可执行文件(拼合的过程)。