GCC编译流程
GCC编译流程分为四个步骤: 编译预处理、编译、汇编和链接
gcc最基本的用法是∶gcc [options] [filenames]
使用gcc可以让源文件编译停在上述四个编译步骤的某一步,也可以一步到位直接得到最后的可执行文件,具体如下:
- 预编译(Pre-Processing)
预编译是在程序被编译之前为编译器所做的一些准备工作,主要是 拷贝包含的头文件到源程序文件、把宏替换成具体的数和处理条件编译。我们使用-E选项来使得GCC编译器在完成预处理后停止执行。
gcc -E test.c -o test.i - 编译(Compiling)
在这个阶段中,GCC编译器首先要 检查代码的规范性,有无语法错误,检查无误后再将代码翻译成汇编语言。 我们使用-S选项来使得GCC编译器只将输入的文件编译成汇编代码,而不再进一步处理。
gcc -S test.c -o test.s 或
gcc -S test.i -o test.s - 汇编(Assembling)
汇编阶段就是把编译阶段生成的 .s文件转换成目标文件。在此可使用选项-c来生成.o的二进制目标代码。
gcc -c test.c -o test.o 或
gcc -c test.s -o test.o - 链接(Linking)
在成功编译后,就进入了链接阶段。所谓链接就是把 前面生成的目标文件及所用到的库函数链接成一个可执行文件。
gcc test.c -o test.out 或
gcc test.o -o test.out
编译过程总结:预编译——》代码无错误时,翻译成汇编语言(编译)——》翻译成二进制代码(汇编)——》将汇编得到的目标文件及所用到的库函数链接成一个可执行文件(链接)
命令总结:
-E:仅执行编译预处理;-S:将C代码转换为汇编代码;-c:仅执行编译操作,不进行连接操作。
-o:指定生成的输出文件的名字,默认为a.out;
g++的编译流程和gcc一样。
测试程序:
#include<stdio.h>
int main(){
printf("这是测试程序\n");
return 0;
}
gdb调试
请直接参考:gdb调试
我觉得gdb对我没什么用。知道gdb是对生成的二进制文件进行调试就行。
其他
1.如果没有给出可执行文件的名字,gcc将生成一个名为a.out的文件
2. 在Linux系统中,可执行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不可执行文件。所以gcc最后输出的可执行文件名可以是任意的,但是为了方便对文件进行区别,一般命名为.out文件
3. 虽然gcc最后输出的可执行文件名可以是任意的,但是gcc的输入文件名不可以是任意的,因为gcc是通过后缀来区别输入文件的类别。
参考:
gcc和g++:
https://blog.csdn.net/yang_quan_yang/article/details/80996032
https://blog.csdn.net/qq_42475711/article/details/85224010
gdb调试:
https://blog.csdn.net/u013525455/article/details/52813637