GCC的编译流程
GCC汇编分为4个阶段,预处理、编译、汇编和连接。
各文件后缀说明如下:
后缀 | 描述 | GCC参数 |
---|---|---|
.c | C 源文件 | 无 |
.i | 预处理的源文件 | -E |
.s | 编译之后得到汇编语言的源文件 | -S |
.o | 汇编之后的二进制文件 | -C |
比如我们有一个test.c文件,结果输出为Hello,World
预处理
输入指令 gcc -E test.c -o test.i (-o之后的表示为命名)
输出得到一个预处理后的文件test.i,会把头文件展开
编译
把刚才的test.i文件,进行如下处理:gcc -S test.i -o test.s
生成test.s后用vim编译器打开
可以发现,我们这里得到的是一个汇编文件,方便接下来的汇编变为二进制的操作。
汇编
把以上的test.s文件进行汇编操作,输入gcc -C test.s -o test.o,就会得到test.o的汇编文件
结果如上图,会出现以上的二进制代码。
连接
最后就是连接操作,输入如下指令:gcc test.o -o aa,就会生成一个aa可执行文件。
打开我们生成的aa文件,正常输出了Hello,World!
简化流程
以上流程是为了让自己更熟悉过程的实现,实际运用中,我们也可以直接使用连接的步骤,系统会默认完成前面三步。代码如下:
直接使用 gcc test.c -o aa,就可以生成我们想要的aa文件了。
GCC参数
以上指令搬运B站up主:爱编程的大丙。
GCC参数的使用
1、gcc test.c -I +文件路径 -I是指定include包含的头文件的路径
2、gcc test.c -D +宏的名称 这里可以指定生成一个宏文件
在这个.c文件中,如果有宏定义DEBUG的存在,就会打印出“我是一个程序员....”
如果没有的话则不会打印,在这使用-D指令生成一个宏定义可以看到,有宏定义之后成功打印了出来“我是一个程序猿....”
GCC和G++的区别和使用
1、不管是GCC还是G++,都可以编译C程序,编译规则和参数都是适用的。
2、G++可以直接编译C++程序,而GCC编译C++还需要加上其他的参数 -lstdc++
3、不管是GCC还是G++都可以定义_cplusplus宏