GNU Compiler Collection
简介
-
GCC支持多种计算机体系结构芯片,如x86、ARM、MIPS等,并已被移植到其他多种硬件平台 。
-
GCC
原名
为GNU C语言编译器(GNU C Compiler),只能处理C语言。但其很快扩展,变得可处理C++,后来又扩展为能够支持更多编程语言
,如Fortran、Pascal、Objective -C、Java、Ada、Go以及各类处理器架构上的汇编语言等,所以改名GNU编译器套件
(GNU Compiler Collection) 。
GCC遵循的部分约定规则
.c为后缀的文件,C语言源代码文件
;
.a为后缀的文件,是由目标文件构成的档案库文件
;
.C,.cc或.cxx 为后缀的文件,是C++源代码文件且必须要经过预处理;
.h为后缀的文件,是程序所包含的头文件
;
.i 为后缀的文件,是C源代码文件
且不应该对其执行预处理;
.ii为后缀的文件,是C++源代码文件
且不应该对其执行预处理;
.m为后缀的文件,是Objective-C源代码文件
;
.mm为后缀的文件,是Objective-C++源代码文件
;
.o为后缀的文件,是编译后的目标文件
;
.s为后缀的文件,是汇编语言源代码文件
;
.S为后缀的文件,是经过预编译的汇编语言源代码文件
。
GCC编译过程
虽然我们称GCC是C语言的编译器,但使用gcc由C语言源代码文件生成可执行文件的过程不仅仅是编译的过程,而是要经历四个相互关联的步骤∶预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编(Assembly)和链接(Linking)。
分步生成命令:(熟记)
- 预处理(pre-processing)E:插入头文件,替换宏
- 编译(Compiling)S:编译成汇编
- 汇编(Assembling) c:编译成目标文件
- 链接 (Linking):链接到库中,变成可执行文件
gcc -E hello.c -o hello.i // -o参数代表output file
gcc -S hello.i –o hello.s
gcc –c hello.s –o hello.o
gcc hello.s –o hello 链接,生成可执行文件
也可以一次性完成:
gcc hello.c –o hello
但一般情况下生成.o文件比较好,可以重定位文件,让别人使用
命令参数用法
在使用GCC编译器的时候,我们必须给出一系列必要的调用参数
和文件名称
。GCC编译器的调用参数大约有100多个,这里只介绍其中最基本、最常用的参数。
GCC最基本的用法是∶gcc [options] [filenames]
其中options就是编译器所需要的参数,filenames给出相关的文件名称。
参数 | 功能 |
---|---|
-c | 只编译,不链接成为可执行文件 ,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件,通常用于编译不包含主程序的子程序文件。常用 |
-o | output_filename,确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个选项,gcc就给出预设的可执行文件a.out。常用 |
-E | 只运行C预编译器(头文件,宏等展开)大写 |
-S | 生成汇编语言文件后停止编译(.s文件)大写 |
-g | 产生符号调试工具(GNU的gdb)所必要的符号资讯,要想对源代码进行调试,我们就必须加入这个选项。常用 |
-O | 对程序进行优化编译、链接,采用这个选项,整个源代码会在编译、链接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、链接的速度就相应地要慢一些。大写O |
-O2 | 比-O更好的优化编译、链接,当然整个编译、链接过程会更慢。大写O |
-v | gcc执行时执行的详细过程,gcc及其相关程序的版本号常用 |
-Wall | 打开编译告警(所有)常用 |
-shared | 生成共享库格式动态链接库 |
-fPIC | 产生位置无关码,允许在任何地址加载 (否则只能从指定地址加载,无法控制)相对地址动态链接库 |
其他参数>
-Idirname,将dirname所指出的目录加入到程序头文件目录列表中,是在预编译过程中使用的参数。C程序中的头文件包含两种情况∶
A)#include <myinc.h>
B)#include “myinc.h”
其中,A类使用尖括号(< >),B类使用双引号(“ ”)。对于A类,预处理程序cpp在系统预设包含文件目录(如/usr/include)中搜寻相应的文件,而B类,预处理程序在目标文件的文件夹内搜索相应文件。
调试和剖析选项(-g | -pg):
GCC支持数种调试剖析选项。在这些选项中最常用的是-g和-pg。
-g选项告诉gcc产生能被GNU调试器(如gdb)使用的调试信息,以便调试用户的程序。
-pg选项告诉gcc在用户的程序中加入额外的代码,执行时,产生gprof用的剖析信息以显示程序的耗时情况。