GCC编译器从拿到一个c源文件到生成一个可执行文件,中间一共经历了4个步骤:
四个步骤并不是GCC独立完成的,而是在内部调用了其他工具,从而完成了整个工作流程:
GCC工作流程:
// 定义一个c源文件
#include <stdio.h>
int main()
{
printf("hello world\n");
return 0;
}
$ gcc -E hello.c -o hello.i # 预处理
$ gcc -S hello.i -o hello.s # 生成汇编文件
$ gcc -c hello.s -o hello.o # 生成二进制文件
$ gcc hello.o -o hello # 生成可执行文件
$ ./hello # 运行文件
hello world
上面4步其实可以简化成1步
$ gcc hello.c -o hello # 直接生成可执行文件
$ ./hello
如果没有指定可执行文件的名称,默认生成a.out
GCC常用选项
选项 | 作用 |
---|---|
-o file | 指定生成的输出文件名为file |
-E | 只进行预处理 |
-S(大写) | 只进行预处理和编译 |
-c(小写) | 只进行预处理、编译和汇编 |
-v / --version | 查看gcc版本号 |
-g | 包含调试信息 |
-On n=0~3 | 编译优化,n越大优化得越多 |
-Wall | 提示更多警告信息 |
-D | 编译时定义宏 |
显示所有警告信息
$ gcc -Wall test.c
将警告信息当做错误处理
$ gcc -Wall -Werror test.c
测试程序(-D选项):
#include <stdio.h>
int main()
{
int a = 3;
#ifdef DEBUG
printf("hello\n");
#endif
printf("hello world\n");
return 0;
}
$ gcc tmp.c -D DEBUG
$ ./a.out
hello
hello world