一、前言:
GNU CC(通常称为GCC)是GNU项目的编译器,它能够编译C、C++语言编写的程序。
gcc是Linux开发的基础,gcc能够支持多种不同的C语言版本,同时提供Linux、Unix、Windows下的编译版本。
目前Windows下C/C++主要的编译器有Borland C++、VC++,但由于gcc是免费的,同时对代码的兼容性做的更加出色,所以在windows的C/C++编译器市场gcc的份额也越来越大。
二、入门:
1、编译的3个阶段:
使用gcc,程序员可以对编译过程有更多的控制,编译过程分为3个阶段。
①预处理;
②汇编;
③链接。
程序员可以再编译的任何阶段结束后停止整个编译过程以检查编译器在该阶段输出的信息。
2、特点:
①使用gcc,程序员可以控制生成二进制执行文件中调试代码的数量和类型。
②和其他编译器一样,gcc也可以优化执行代码。
③gcc是个交叉平台编译器,所以能够在当前CPU平台上为不同操作系统开发软件。
④gcc对C和C++进行了一些扩展,有助于提高执行效率以及编译器进行代码优化。
⑤gcc可以让跨平台编程更加容易,降低代码移植代价。
深入了解gcc之前,我们先看一个小例子。
#include <stdio.h>
int main(int arg, char *args[])
{
if (arg < 3)
printf("请输入2个参数\n");
else
{
int a = atoi(args[1]);
int b = atoi(args[2]);
printf("%d 加 %d 等于 %d\n", a, b, a + b);
}
return 0;
}
在命令行键入命令编译和运行这段程序
$gcc -o hello hello.c
这行命令告诉gcc对源程序hello.c进行编译和链接,并使用参数-o指定创建名为hello的可执行程序。
整个过程看上去仿佛是一气呵成的,但其实是分几步的:
①预编译源代码;
②编译目标代码;
③链接程序。
①预编译:
在命令行键入命令。
$gcc -o hello1.c -E hello.c
这行命令告诉gcc对源程序hello.c进行预编译,预编译结果输出到hello1.c文件中。
②编译:
在命令行键入命令。
$gcc -o hello.o -c hello1.c
这行命令告诉gcc对源程序hello.c进行编译,但不链接,编译输出到hello.o文件中。
③链接:
在命令行键入命令。
$gcc -o hello hello.o
这行命令告诉gcc对源程序hello.o进行链接,生成可执行程序hello。
三、进阶:
1、gcc常用选项
-o filename:输出文件名,如果没指定filename,默认为a.out
-c: 只编译,不链接
-E: 预编译
-S: 汇编
-g: 包含调试信息
-I: 指定包含头文件路径
-D: 编译时定义指定的宏,相当于源代码中的#define宏定义
-L: 指定要链接库文件的路径
-l: 链接指定的库文件
-O: 优化编译后的代码
-w: 关闭所有告警信息
-Wall: 开启所有告警信息
-Werror: Warning当做错误处理
-static: 强制链接时链接静态库
-fPIC: 编译与位置无关的代码,主要用于编译共享库
-shared: 生成共享库so文件
-pedantic: 发现一些不符合 ANSI/ISO C标准的代码
2、文件类型
Q:gcc是如何知道文件类型呢?
A“通过文件扩展名判断文件类型
c: C语言源文件
cpp: C++源文件
s: 汇编语言源文件
o: 编译后的目标代码文件
a,so: 编译后的库文件