前言
GCC,全称The GNU Compiler Collection,包含了 C, C++, Objective-C, Fortran, Ada, Go等语言的编译器前端以及这些语言所依赖的一些库文件。虽然现在的IDE基本可以搞定很多编译的事情,但是很多时候,b比如我们看源码的时候、自己编写一些Python C++扩展模块的时候等,使用IDE可能会比较繁琐,这时候就需要手动编译,需要看懂或者会编写编译脚本,这样,我们想在别人的基础上作些改动才有可能。因此有必要了解一下GCC。
需要说明的是,这里的GCC和你在命令行调用的gcc并不是一个东西。做个简单但很可能不完全正确的说明,GCC表示一套编译器的集合,而gcc,最开始表示GUN C Compiler,用于编译C,后来随着越来越多东西的加入,变成了GCC。现在gcc和g++只不过是GNU Compiler Collection的驱动程序。他们之间最大的区别可能就是他们链接的时候所使用的链接库不同。简单点记就是用gcc编译C,g++编译C++,当然,你也可以-x选项去使用gcc编译其他语言,例如使用gcc -xc++
去编译C++。
参数类型分类
- 控制输出结果,如
-c -S -E -o file -x language
等; - 控制当前编译源码所需遵循的语言标准,如
-ansi -std=standard -fgnu89-inline
等; - 控制警告信息,如
-Wall
等; - 控制调试,如
-g -glevel*
等; - 控制优化,如
-O -O0 -O1 -O2 -O3 -Os -Ofast -Og
等; - 控制预处理;
- 控制汇编;
- 控制链接,如
-shared -shared-libgcc -symbolic -llibrary
; - 控制代码生成;
- 控制编译过程所需要搜索的目录,如
-Bprefix -Idir -I-
; - 硬件依赖;
- 开发者相关。
这里只是分类简单介绍一些常用的选项。更多更详细的信息参阅参考文档的内容。
控制输出结果
我们知道,编译过程可以分为预处理、编译、汇编、链接四个阶段。这四个阶段按顺序进行,并且每个阶段都会产出用于下一个阶段的中间产物。由于编译并不是一步到位