博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++程序编译过程
阅读量:4984 次
发布时间:2019-06-12

本文共 1706 字,大约阅读时间需要 5 分钟。

首先,编写最简单的C++代码并保存为main.cpp:

Hello word
1 #include 
2 using namespace std;3 4 int main(int argc, char* argv[])5 {6 cout << "Hello world!" << endl;7 return 0;8 }

使用命令g++ main.cpp,将会编译连接得到可执行文件a.out,(这里需要明确的是g++会调用gcc,而gcc实际上包装了后台一些程序,根据不同的参数去调用相应的程序进行处理)。

事实上从源文件main.cpp到可执行文件a.out的过程包括了如下的4个主要步骤:

预处理(Preprocessing)

编译(Compliation)

汇编(Assembly)

链接(Linking)

1. 预处理

预处理调用预处理器cpp, 主要处理包括以下过程:

  • 文件包含。处理#include预编译指令,将被包含的文件插入到该预编译指令所在位置。
  • 条件编译。处理#if #indef #elif #else #endif 等条件预编译指令,主要是进行编译时进行有选择的挑选,注释掉一些指定的代码,以达到版本控制、防止对文件重复包含的功能。
  • 布局控制。处理#progma预编译指令,为编译程序提供非常规的控制流信息。
  • 宏替换。处理#define预编译指令,展开宏定义。
  • 其它一些预处理工作,如删除所有注释 “//”和”/* */”,添加行号和文件标识,以便编译时产生调试用的行号及编译错误警告行号。

预处理命令:

  gcc - E main.cpp -o main.i (或g++ -E main.cpp -o main.i)

  -E 表示只进行预处理。也可以用命令cpp(the C Preprocessor)完成预处理:

  cpp main.cpp > main.i

生成的 *.i 是预处理之后的代码。

2.编译

执行编译程序cc1plus(c语言则是cc1), 主要工作是把预处理完的文件进行一系列的词法分析,语法分析,语义分析及代码优化后生成相应的汇编代码。

命令:

  gcc –S main.i –o main.s

或者

  /usr/lib/gcc/i586-suse-linux/4.1.2/cc1plus main.cpp

如果是c源文件,则执行

  /usr/lib/gcc/i586-suse-linux/4.1.2/cc1 main.c

生成的 *.s 是汇编代码。

3.汇编

执行汇编命令as, 是将汇编代码转变成机器可以执行的命令,每一个汇编语句几乎都对应一条机器指令。汇编相对于编译过程比较简单,根据汇编指令和机器指令的对照表一一翻译即可。

命令:

  gcc -c main.cpp -o main.o

或者

  as main.s -o main.o

4.链接

调用链接器ld, 链接程序运行所依赖的目标文件,以及所依赖的其它库文件,最后生成可执行文件

  ld -static crt1.o crti.o crtbeginT.o hello.o -start-group -lgcc -lgcc_eh -lc-end-group crtend.o crtn.o (省略了文件的路径名)。

链接部分需要注意的是:对于c++源程序,gcc不能自动和c++的库链接,所以只能使用g++来链接。

通常情况下,对C++源代码,我们直接使用g++命令完成了上述的所有过程。

g++ -o main main.cpp

g++ main.cpp

总结过程就是:

main.cpp -->预处理(cpp)--> main.i -->编译(as)--> main.s -->汇编(as)--> main.o(依赖的其它 *.o) -->链接(ld)--> main可执行程序

                                                                                              

转载于:https://www.cnblogs.com/litterrondo/archive/2013/01/28/2880281.html

你可能感兴趣的文章
PHP处理SOAP
查看>>
非原创 jvm 垃圾回收
查看>>
ecshop完美解决前台和后台自动退出、购物车自动清空
查看>>
服务容器
查看>>
mqtt实现自动监听服务器消息
查看>>
SQL里面如何取得前N条数据?
查看>>
hibernate下关于cascade = CascadeType.ALL的使用,操作不好导致删了重要的数据
查看>>
十三、RF中对json的解析
查看>>
linux 终端快捷键
查看>>
cocos2d-x onMouseMove中CCTouch *pTouch参数的细节
查看>>
冲突域
查看>>
在Windows平台下Elasticsearch同步MySql数据库
查看>>
第5章 开发用户登录注册与用户信息
查看>>
1-3+项目结构介绍
查看>>
第4章 类与对象 面向对象程序的基本特点
查看>>
编程容易犯错的几个地方
查看>>
robot framework 接口测试返回错误
查看>>
Promethus安装指南
查看>>
菜鸟水平如何在Android Studio中添加uiautomator测试框架
查看>>
[asp.net]异步提交数据库实现简单购物车
查看>>