GCC全称GNU C Compiler,是以GPL协议发布的自由软件,其创始人理查德·马修·斯托曼是自由软件运动的精神领袖。
GNU 编译器套件包括 C、C++、Objective-C、Java、Ada 和 Go 语言前端,也包括了这些语言的库(如 libstdc++,libgcj等)
GCC 不仅支持 C 的许多“方言”,也可以区别不同的 C 语言标准;可以使用命令行选项来控制编译器在翻译源代码时应该遵循哪个 C 标准。例如,当使用命令行参数-std=c99 启动 GCC 时,编译器支持 C99 标准。
查看版本 gcc/g++ -v/–version
g++相对gcc对代码书写规范更加严格,如果编译 c++ 语言,将其替换为 g++ 即可。
编译过程
高级语言源代码 -> 汇编语言 -> 机器语言
新建文件 t.c
vim t.c
12345#include
预处理
展开所有的include文件,包括头文件和宏定义,生成.i文件
g++ -E t.c -o t.i
编译
把目标代码编译为汇编代码,生成.s文件
gcc -S t.cpp -o t.s
汇编器
把指定源码编译为机器码.o文件包括(启动代码,目标代码,库代码,其它目标代码),但不进行链接
gcc -c t.c -o t.o
链接器
生成可执行 ELF 文件
gcc t.o -o t
常用参数
gcc编译选项
说明
-E
预处理指定的源文件,不进行编译
-S
编译指定的源文件,但是不进行汇编
-c
编译、汇编指定的源文件,但是不进行链接
-o [file1] [file2] / [file2] -o [file1]
将文件 file2 编译成可执行文件 file1
-I directory
指定 include 包含文件的搜索目录
-g
在编译的时候,生成调试信息,该程序可以被调试器调试
-D
在程序编译的时候,指定一个宏
-w
不生成任何警告信息
-Wall
生成所有警告信息
-On
n的取值范围:0~3。编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
-l
在程序编译的时候,指定使用的库
-L
指定编译的时候,搜索的库的路径。
-fPIC/fpic
生成与位置无关的代码
-shared
生成共享目标文件,通常用在建立共享库时
-std
指定C方言,如:-std=c99,gcc默认的方言是GNU C
在程序中加入调试信息
新建源文件 t.c
12345678910111213141516171819202122#include
使用两种方式可以输出 DEBUG,一种是在程序开头定义 DEBUG宏,例如 #define DEBUG
另一种是使用 gcc -D 命令选项。
gcc t.c -o t -D DEBUG //DEBUG是在程序中指定的,可以指定多个
执行./t,就能输出 DEBUG信息
不生成任何警告
-w
gcc t.c -o t -w
生成所有的警告信息
-Wall
gcc t.c -o t -Wall
执行上述语句,则会输出:
t.c:4:9: warning: unused variable ‘a’ [-Wunused-variable]
int a = 10;
编译器优化级别
-O0
-O1
-O2
-O3
级别越高,编译优化越大,越不容易通过反汇编得到原始代码。
包含调试信息
此时调试信息为源代码,该程序可被调试器调试,比如可被GDB调试
-g
gcc t.c -o t -D DEBUG -g //该程序还包括-D参数,调试时包括DEBUG信息
指定include 包含文件的搜索目录
gcc t.c -o t -I 路径 //I为i的大些
在程序编译时,指定使用的库
-l
gcc t.c -o t -l 库名称
在编译时,指定使用的库的路径
-L
gcc t.c -o t -L 库路径
生成与位置无关代码
-fpic/fPIC
gcc t.c -o t -fpic
生成共享目标文件,通常用在建立共享库时
-shared
gcc t.c -o t -shared
指定c方言
-std=c99
gcc t.c -o t -std=c99 以c99标准编译源文件