创建一个可执行文件是一个多级过程,其中包括预处理(preprocessing)、编译(compliation)、汇编(assembling)、链接(linking)。
1.预处理
# -E 选项指示编译器仅对输入文件进行预处理
g++ -E test.cpp -o test.i //.i文件
预处理就是预处理器对源代码中以#开始的预处理指令进行处理的过程。它会处理:
头文件包含指令(#include)
条件编译指令(#ifdef……#endif)
宏(#define)
删除所有的注释
添加行号和文件标识
保留所有的#pragma编译器指令
2.编译
# -S 编译选项告诉 g++ 在为 C++ 代码产生了汇编语言文件后停止编译
# g++ 产生的汇编语言文件的缺省扩展名是 .s
g++ -S test.i -o test.s
编译就是把预处理完的文件进行一系列词法分析,语法分析,语义分析及优化后生成相应的汇编代码文件.
3.汇编
# -c 选项告诉 g++ 仅把源代码编译为机器语言的目标代码
# 缺省时 g++ 建立的目标代码文件有一个 .o 的扩展名。
g++ -c test.s -o test.o
汇编器是将汇编代码转变成机器可以执行的命令.
4.链接
# -o 编译选项来为将产生的可执行文件用指定的文件名
g++ test.o -o test
链接是把一堆对象文件和库(有时也可能仅仅是一个对象文件,但也需要链接)创建成一个单独的可执行文件。
直接编译
# 将 main.cpp src/Swap.cpp 编译为可执行文件 附带一堆参数
g++ main.cpp src/Swap.cpp -std=c++17 -O3 -g -Wall -o b.out
# 运行 b.out
./b.out