接触C++其实已经很久了,今天开始从编译流程来聊聊,开启我的第一篇C++博文
IDE
我相信很多人写的第一个C语言程序是用VC++6.0,其实它就是一个IDE(Integrated Development Environment),中文名叫集成开发环境,它诞生的目的是减轻程序员的负担.但是它屏蔽了很多操作,有时候让程序员不知所云.最常见的就是,利用IDE创建一个项目时,一开始就莫名的生成了一堆文件 .
C++编译流程
首先,在同一个文件夹下创建两个文件a.cpp和a.h .它们的代码分别是: 1
2
3
4
5
#include "a.h"
int main ()
{
return 0 ;
}
接下来就是,整个编译过程
预处理
之后我们得到的a.ii文件为: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 1 "a.cpp"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "a.cpp"
# 1 "a.h" 1
void fun();
int global;
# 2 "a.cpp" 2
int main()
{
return 0;
}
上面代码的#号 是注释,那么我们发现预处理就是把#inlcude “a.h”的文件换成a.h中的代码
编译阶段
之后我们得到的a.s文件为: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
.file "a.cpp"
.globl global
.bss
.align 4
.type global, @object
.size global, 4
global:
.zero 4
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4"
.section .note.GNU-stack,"",@progbits
学过汇编的人应该知道这就是汇编代码
生成目标代码
结果是一堆只有机器可以看懂的机器代码
链接
得到的a.out就是最后的可执行程序
另外补充一下,其实用一句代码就可以实现上面的过程以及保留相应的文件,我上面所做的只是为了说明一下这个过程: