GCC简介
GCC简介
1.什么是GCC
GCC原名为GNU C语言编译器(GNU C Compiler),后来随着不断发展,被称为GNU编译器套件(GNU Compiler Collection)。是由 GNU 开发的编程语言译器。GNU 编译器套件包括 C、C++、Objective-C、Java、Ada 和 Go 语言前 端,也包括了这些语言的库(如 libstdc++,libgcj等)。
2.GCC的特点
- GCC是一个可移植的编译器,支持多种硬件平台。例如ARM、X86等等。
- GCC不仅是个本地编译器,它还能跨平台交叉编译。所谓的本地编译器,是指编译出来的程序只能够在本地环境进行运行。而gcc编译出来的程序能够在其他平台进行运行。例如嵌入式程序可在x86上编译,然后在arm上运行。
- GCC有多种语言前端,用于解析不同的语言。
- GCC是按模块化设计的,可以加入新语言和新CPU架构的支持。
- GCC是自由软件。任何人都可以使用或更改这个软件。
- GCC不仅支持 C 的许多“方言”,也可以区别不同的 C 语言标准;可以使用命令行选项来控制编译器在翻译源代码时应该遵循哪个 C 标准。例如,当使用命令行参数
-std=c99
启动 gcc 时,编译器支持 C99 标准。
3.编程语言发展史
4.GCC工作流程
GCC编译程序主要经过四个过程:
- 预处理(Pre-Processing)
- 编译 (Compiling)
- 汇编 (Assembling)
- 链接 (Linking)
- 预处理阶段将头文件、宏进行展开
- 编译阶段,GCC调用不同语言的编译器,例如c语言调用编译器ccl。
- 汇编阶段,GCC调用汇编器进行汇编,汇编器生成的是可重定位的目标文件。
- 链接过程会将程序所需要的目标文件进行链接成可执行文件。
GCC的常用参数选项
选项名 | 作用 |
---|---|
-o [file1] [file2] / [file2] -o [file1] | 将文件 file2 编译成可执行文件 file1 |
-E | 只运行C预编译器 |
-S | 告诉编译器产生汇编程序文件后停止编译,产生的汇编语言文件拓展名为.s |
-c | 通知gcc取消连接步骤,即编译源码,并在最后生成目标文件 |
-Wall | 使gcc对源文件的代码有问题的地方发出警告 |
-w | 不生成任何警告信息 |
-Idir | 指定 include 包含文件的搜索目录 |
-Ldir | 指定编译的时候,搜索的库的路径。 |
-llib | 在程序编译的时候,指定使用的库 |
-g | 在目标文件中嵌入调试信息,以便gdb之类的调试程序调试 |
-On | n的取值范围:0~3。编译器的优化选项的4个级别,-O0表 示没有优化,-O1为缺省值,-O3优化级别最高 |
-fPIC/fpic | 生成与位置无关的代码 |
-shared | 生成共享目标文件,通常用在建立共享库时 |
-std | 指定C方言,如:-std=c99,gcc默认的方言是GNU C |
关于GCC,gcc和g++的辨析
GCC:GNU Compiler Collection(GNU编译器套件),它可以编译C、C++、JAV、Fortran、Pascal、Object-C、Ada等语言。
gcc是GCC中的GUN C Compiler(C 编译器)
g++是GCC中的GUN C++ Compiler(C++编译器)
gcc和g++的主要区别
对于 .c和.cpp文件,gcc分别当做c和cpp文件编译(c和cpp的语法强度是不一样的)
对于 .c和.cpp文件,g++则统一当做cpp文件编译
使用g++编译文件时,g++会自动链接标准库STL,而gcc不会自动链接STL
gcc在编译C文件时,可使用的预定义宏是比较少的
gcc在编译cpp文件时/g++在编译c文件和cpp文件时(这时候gcc和g++调用的都是cpp文件的编译器),会加入一些额外的宏。
在用gcc编译c++文件时,为了能够使用STL,需要加参数 –lstdc++ ,但这并不代表 gcc –lstdc++ 和 g++等价,它们的区别不仅仅是这个。
参考
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Raining的小站!
评论