预处理 编译 汇编 链接

来源:互联网 发布:linux重启mysql命令 编辑:程序博客网 时间:2024/05/21 10:52

从一个.c 或 .cpp 文件,到 .out 文件,要经过以下几个过程。

一、预处理

读取源文件,对特殊符号进行处理;比如

1、宏定义

2、条件编译指令

3、头文件

4、删除注释

简单来说就是一个字符替换的过程。

gcc 中利用-E选项只进行到预处理,得到预处理文件 hello.i

$ gcc -E hello.cpp -o hello.i

二、编译

编译阶段主要是对预处理得到的文件进行词法、语法、语义分析,得到相应的汇编代码。

gcc 中利用 -S 选项只进行到编译阶段,生成汇编文件,跳过汇编与链接阶段

$ gcc -S hello.i -o hello.s

三、汇编

汇编阶段就是把汇编代码转换成机器码,生成目标文件。目标文件虽然是机器码,但仍然不能执行,因为缺少相应的库

gcc 中利用 -c 选项只进行到汇编阶段,不进行链接,生成目标文件hello.o

$ gcc -c hello.s -o hello.o

四、链接

链接阶段,链接器把一堆目标文件以及它们所需要的库文件链接起来,生成可执行程序

gcc中可以通过 ld 命令来把目标文件与库文件链接起来

ld -static o1.o o2.o -l xx.lib

链接又分为两种,静态链接和动态链接

静态链接

静态链接就是链接时把静态库中所用到的代码直接链接到目标程序中,生成可执行程序;程序运行的时候就不再需要库文件。

动态链接

动态链接没有把库中所需要的所有代码链接到目标程序中,程序运行时需要动态库的支持。


linux 与 windows各种文件的后缀名

                    linux windows

目标文件     .o       .obj

静态库         .a       .lib

动态库         .so     .dll

可执行         .out    .exe


动态库文件、静态库文件制作示例:

http://wenku.baidu.com/view/7d8602b265ce050877321301.html


0 0