接触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;
}

1
2
void fun();
int global;

接下来就是,整个编译过程

预处理

1
g++ -E a.cpp -o a.ii

之后我们得到的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中的代码

编译阶段

1
g++ -S a.ii -o a.s

之后我们得到的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

学过汇编的人应该知道这就是汇编代码

生成目标代码

1
g++ -c a.s -o a.o

结果是一堆只有机器可以看懂的机器代码

链接

1
g++ a.o -o a.out

得到的a.out就是最后的可执行程序

另外补充一下,其实用一句代码就可以实现上面的过程以及保留相应的文件,我上面所做的只是为了说明一下这个过程:

1
g++ a.cpp --save-temps