GNU CC(通常称为GCC)是GNU项目的编译器,它能够编译C、C++语言编写的程序。
使用gcc,程序员可以对编译过程有更多的控制,编译过程分为3个阶段。
预处理;
汇编;
链接。
程序员可以再编译的任何阶段结束后停止整个编译过程以检查编译器在该阶段输出的信息。
深入了解gcc之前,我们先看一个小例子。
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("Hello World\n");
printf("Hello Silece\n");
return 0;
}
/*改程序名为a.c*/
在命令行键入命令编译和运行这段程序
gcc -o a a.c
这行命令告诉gcc对源程序a.c进行编译和链接,并使用参数-o指定创建名为a的可执行程序。
整个过程看上去仿佛是一气呵成的,但其实是分几步的
1.预编译源代码;
2.编译目标代码;
3.链接程序。
源代码(例如a.c)------->预处理器-------->编译器----->目标代码(例如a.o)------>连接器---------可执行程序
^ ^
| |
| |
头文件(*.h) 库代码
gcc -o a a.c -o 参数表示输出文件为a
预编译
在命令行键入命令。
$gcc -o a1.c -E a.c (可以查看一下a1.c里面的内容,就会发现有什么不同了)
这行命令告诉gcc对源程序a.c进行预编译,预编译结果输出到a1.c文件中。
-c参数表示只编译,不链接
编译
在命令行键入命令。
gcc -o a.o -c a1.c
这行命令告诉gcc对源程序a1.c进行编译,但不链接,编译输出到a.o文件中。
链接
在命令行键入命令。
$gcc -o a a.o
这行命令告诉gcc对源程序a.o进行链接,生成可执行程序a。
如果是这样编译:gcc -o a.c 则生成的可执行程序默认为a.out(这个文件名是历史遗留问题)
gcc -S -o a.s a.c 这个是生成汇编文件a.s
gcc -o a a.c -lpthread 这里的-lpthread 中的-l表示连接指定的库(pthread是多线程的库,当然,我这里的a.c并没有使用多线程的库函数)
gcc -o -Wall a a.c 这里的-Wall参数表示开启所有告警信息