0%

GCC 基本使用教程

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

1
2
3
4
5
#include <stdio.h>
int main(){
printf("Hello world");
return 0;
}

预处理

展开所有的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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>

int main()
{

int a = 10;

#ifdef DEBUG
printf("这是一条调试信息\n");
#endif

int b, c, d, f;
b = 10;
c = b;
d = c;
f = d;
for (int i = 0; i < 3; i++)
{
printf("hello gcc\n");
}
return 0;
}

使用两种方式可以输出 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标准编译源文件