gcc是GUN推出的功能强大,性能优越的多平台编译器,就是以前的GUN C 编译器。可以在多重平台上编译出可执行程序的编译器集合,集成C,C++,fortran,Java,Fortran和Pascal等多种语言编译器。
他可以运行各种liunx 发行版,BSD,以及solaris等多种操作系统,并能够编译X86,X86-64等不同硬件平台上。还可以实现不同平台上的交叉编译,如在liunx平台上编译windows下的可用的软件。
gcc后面通过文件后缀进行区分
以“ .c"为后缀的文件,都是C语言代码文件
以” .a"为后缀的文件,都是有目标文件构成的档案库文件。
以“.C" “.cpp” " .cc"或者" .cxx"为后缀的文件,是C++源代码文件。
以” .h"为后缀的文件,都是程序所包含的头文件
以“ .i"为后缀的文件,都是已经预处理过的C源代码文件。
以” .ii"为后缀的文件,都是已经预处理过的C++源代码文件。
以“ .m"为后缀的文件,都是obiective-C源代码文件。
以” .o"为后缀的文件,都是编译后的目标文件。
以“ .s" 为后缀的文件,是汇编语言的源代码文件
以” .S“为后缀的文件,都是经过预编译的汇编语言源代码文件。
gcc对C 或者c++编译工作大致可分为如下4个步骤:
1:预处理,生成以” .i"的文件
2:将预处理后的文件不转换成汇编语言,生成文件“ .s" (编译器eggs)
3:有汇编变为目标代码(机器代码)生成”.o"的文件(汇编器as)
4:连接目标代码,生成可执行程序(链接器ld)。
gcc的基本用法和常用选项
gcc 选项 文件名
例如:
1:[root@cfhzx ~]# vi hello.c 先创建一个文件并编辑
2编辑内容:内容在下图
3:运行: [root@cfhzx ~]# gcc hello.c 运行hello.c这个文件
4:输出:[root@cfhzx ~]# ./a.out 让他输出在屏幕上
如果未进行指定输出文件名,gcc编译出来的程序后缀名是一个名为a.out的可执行文件。
gcc常用编译选项:
-I:指定头文件路径;如 gcc -I./include
-D:定义一个宏;如 gcc -DHAVE_CONFIG_H,定义宏HAVE_CONFIG_H
-Wall:开启所有错误提示,可理解为warinig all
-g:编译过程中保留调试信息,以便gdb能够调试
-O2:指定编译优化等级为2,optimization
-pipe:指定编译过程中不同阶段的通信使用pipe管道(有些编译器无法读取管道,目前GNU编译器是ok的)
-Wp,-D_FORTIFY_SOURCE=2:将逗号分隔的选项传递给预处理器,其中FORTIFY_SOURCE选项用于指定在编译时检查缓冲区溢出的等级
-fexceptions:启用异常处理,会产生额外的代码用于处理异常,会占用一定量的数据空间(gcc默认为C++打开该选项,为C关闭该选项)
-fstack-protector:开启栈保护检测,防止缓冲区异常
--param=ssp-buffer-size=4:--param用于控制一些用于优化的常量,比如内联函数的指令数量限制等,
ssp-buffer-size用于控制预防堆栈溢出的缓冲区的下限值,和-fstack-protector选项一同使用
-m64:指定生成64位的x86-64架构代码
-mtune=generic:为指定的CPU架构优化代码
-fPIC:生成位置无关的代码,适用于动态链接
-fPIE:为可执行文件生成位置无关代码