沉铝汤的破站

IS LIFE ALWAYS THIS HARD, OR IS IT JUST WHEN YOU'RE A KID

g++编译过程

序言

记录一下编译的具体过程,我是菜狗,主要是写给自己看的。

*勘误:*后续的学习过程中发现,.i后缀是C语言后缀,而C++后缀其实是.ii**

小知识

编译过程:

指令

预处理 g++ -E test.cpp -o test.ii
编译 g++ -S test.i -o test.s
汇编 g++ -c test.s -o test.o
链接 g++ test.o -o test.exe
选项 含义
-E 进行预处理
-S(upper) 进行预处理和编译
-c(lower) 进行预处理、编译和汇编
-o xx 指定生成的文件名为xx

开始实验

1.准备一个cpp文件

如下:

2.直接让其生成一个可执行文件

指令:

>>g++ hello.cpp -o hello.exe
>>
//然后再运行
>>./hello.exe
>>Yeah, you did it!

3.分步编译

①预处理

g++ -E hello.cpp -o hello.i

得到的结果如图:

可以看到,预处理将头文件拓展开来,足足有20000多行,而我们的代码只有十行左右。

②编译

g++ -S hello.ii -o hello.s

得到的结果如图:

可以看到,编译将我们的代码变成了汇编语言。

③汇编

g++ -c hello.s -o hello.o

得到的结果如图:

可以看到,汇编将原汇编语句转化为了二进制

但是这个文件还不可以执行,其中缺少依赖的库

./hello.o

结果:

④链接

g++ hello.o -o hello.exe

./hello.exe

成功执行:

至此,实验阶段结束

一些思考

如果我们要把两个cpp文件链接在一起呢?

这里我准备了两个文件,一个是hello.cpp,另一个是hello2.cpp

然后输入指令

g++ hello.cpp hello2.cpp -o hello.exe

./hello.exe

得到结果