一、介绍
GCC(GNU Compiler Collection,GNU编译器套件),是由 GNU 开发的编程语言编译器。GCC原本作为GNU操作系统的官方编译器,现已被大多数类Unix操作系统(如Linux、BSD、Mac OS X等)采纳为标准的编译器。
GCC 原名为 GNU C 语言编译器(GNU C Compiler),因为它原本只能处理 C语言,后来经过不断扩展能够支持更多的编程语言,如 C++、Fortran、Pascal、Objective-C、Java、Ada、Go以及各类处理器架构上的汇编语言等,所以改名为GNU编译器套件。
二、基本用法
1、语法
gcc [选项] 源文件 [选项] [目标文件]
2、选项列表
选项 | 含义 |
---|---|
-E | 仅执行到预处理阶段 |
-S | 执行到编译阶段,将C代码编译成汇编代码 |
-c | 执行到汇编阶段,将汇编代码编译成为机器可识别的二进制指令代码 |
-static | 对生成的文件进行静态链接 |
-share | 对生成的文件进行动态链接,需要动态库 |
-g | 生成调试信息 |
-O0 | 不进行优化处理 |
-O1,-O2,-O3 | 优化处理,且优化级别依次升高 |
-w | 不生成任何警告信息 |
-Wall | 生成所有警告信息 |
三、编译过程
1、预处理
功能:宏替换、头文件展开、去注释、条件编译
实例:gcc -E test.c -o test.i
2、编译
功能:语法分析及纠错,无错则将c代码编译成汇编代码
实例:gcc -S test.c/test.i -o test.s
3、汇编
功能:将汇编代码编译成为机器可识别的二进制指令代码
实例:gcc -c test.s -o test.o
4、链接
功能:生成可执行文件或库文件
(1)静态链接
在编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。
静态库命名方式:libc.a :lib是前缀,.a是后缀
实例:gcc -static test.o -o test
(2)动态链接
在编译链接时,并没有把库文件的代码加入到可执行文件中,而是在程序执行时由链接文件(记录函数的地址信息)加载库,这样可以节省系统的开销,但是运行时依赖库文件。
动态库命名方式:libc.so :lib是前缀,.so是后缀
实例:gcc test.o -o test
要点:gcc默认生成的二进制程序是动态链接的