序言
记录一下编译的具体过程,我是菜狗,主要是写给自己看的。
*勘误:*后续的学习过程中发现,.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
得到结果