C/C++从代码到可执行程序

来源:互联网 发布:cn是哪个国家的域名 编辑:程序博客网 时间:2024/06/01 08:11

我们在平时开发中,很少去关注程序是怎么跑起来的,一个简单的helloworld程序是每一个程序猿闭着眼睛就能写出来的,编译运行一气呵成,成为了程序入门和开发环境测试的默认标准

#include <stdio.h>int main(int argc,char* argv[]){    printf("hello world\n");    return 0;}

在xcode下我们直接使用command+R运行程序,就可以看见控制台输出hello world.
事实上,上述过程可以分解为4个步骤。分别是预处理、编译、汇编、链接;
重点内容
第一步:预处理:
预处理器主要处理那些源文件代码中的”#”开始的预编译指令,主要规则如下:
–删除所有的”#define”,展开所有的宏定义;
–处理所有的条件预编译指令;如”#if”、”#ifdef”、”#elif”等;
–处理”#include”预编译指令,将被包含的文件插入到预编译指令的位置,注意这个过程是递归进行的,也就是说被包含的文件还有可能包含其他文件;
–删除所有的注释”//”和”/* */”;
–添加行号和文件标示,比如#2 “hello.c” 2,以便于编译时产生调试用的行号信息及用于编译时产生编译错误或警告时能够显示行号;
–保留所有的#pragram 编译器指令,因为编译器需要使用它们。
我们可以在终端中使用如下命令来只进行预处理过程
$gcc -E hello.c -o hello.i
预处理后的.i文件不包含任何宏定义,我们可以通过查看.i文件来验证上述步骤;

第二步 编译:
编译器主要就是把预处理完的.i文件进行一系列的词法分析、语法分析、语义分析及优化之后生成相应的汇编代码文件,这个过程就是我们所说的程序构建的核心部分,因为涉及到编译原理,相对来说比较复杂,这里我们暂时只要了解这过程就可以了;上述过程相当于如下命令
$gcc -S hello.i -o hello.s
编译之后生成.s文件,我们可以通过查看生成的.s文件验证上述步骤,此时生成的.s文件里存储的为汇编代码

第三步 汇编:
汇编器是将汇编代码转变成机器可以执行的指令,每一个汇编语句几乎都对应一条机器指令,所以汇编器的汇编过程相对于编译器来讲比较简单,没有复杂的语法,也没有语义,也不需要指令优化,只是根据汇编指令和机器指令对照表一一翻译就可以了上述过程我们可以使用如下命令完成
$gcc -c hello.s -o hello.o
编译之后生成.o文件,我们可以通过查看生成的.o文件验证上述步骤,此时生成的.o文件存储的为二进制数据

第四部 链接:
每个.c文件经过上述步骤都生成了对应的目标文件(扩展名为.o或.obj),把生成的所有的目标文件组装到一起的过程就是链接。链接主要就是把各个文件之间相互引用的部分处理好,使得各个文件之间能够正确衔接。链接完成之后生成可执行文件a.out(unix下)

                        --摘自《程序员的自我修养》
0 0