文章目录
GCC
(GNU Compiler Collection
,GNU编译器套件
),是由GNU
开发的编程语言编译器
。
GNU项目始于1987年,是一个开发大量免费UNIX软件的集合(GNU的意思是 GNU’s Not UNIX,即GNU不是UNIX)。GNU编译器集合(GCC,其中包含GCC C编译器)是该项目的产品之一。
1、 GCC 主要软件包
序号 | 名称 | 功能描述 |
---|---|---|
1 | cpp | C预处理器 |
2 | gcc | C编译器 |
3 | g++ | C++编译器 |
4 | gccbug | 创建BUG报告的Shell脚本 |
5 | gcov | 覆盖测试 工具,用于分析在程序的哪个位置做优化效果最佳 |
6 | libgcc | GCC 的运行库 |
7 | libstdc++ | 标准C++库 |
8 | libsupc++ | 提供支持C++ 语言的函数库 |
2、 GCC 编译过程
2.1 GCC 编译过程
从hello.c
到hello
(或a.out
)文件,必须历经hello.i
、hello.s
、hello.o
,最后才得到 hello
(或a.out
)文件,分别对应着预处理
、编译
、汇编
和链接
4个步骤,整个过程如图所示:
序号 | 步骤 | 工作内容 |
---|---|---|
1 | 预处理 (Preprocess) | C 编译器 对各种预处理命令 进行处理,包括:(1) 展开所有的头文件 、(2) 宏定义的替换 、(3) 解析条件编译 并添加到文件中 |
2 | 编译 (Compile) | 将预处理 后的文件进行词法分析 、语法分析 、语义分析 及优化 后,生成相应的.s 汇编文件 |
3 | 汇编 (Assemble) | 将编译 后的汇编代码 翻译成机器码 ,生成.o 目标文件 |
4 | 链接 (Link) | 通过链接器ld 将目标文件 和库文件 链接在一起,生成可执行文件 (executable file) |
序号 | 命令 | 描述 |
---|---|---|
1 | gcc -E hello.c -o hello.i | 预处理(预处理器 Preprocessor:cpp 。-E :只对文件进行预处理 ,不编译汇编和链接) |
2 | gcc -S hello.i -o hello.s | 编译(编译器 Compiler:gcc ,g++ 。-S :只对文件进行编译 ,不汇编和链接) |
3 | gcc hello.s -o hello.o | 汇编(汇编器 Assembler:as) |
4 | gcc hello.o -o hello | 链接(链接器 Linker:ld) |
2.2 GCC 单步完成编译
第1种命令:gcc hello.c -o hello
第2种命令:gcc -o hello hello.c
3、GCC 常用 选项和参数
序号 | 命令 | 描述 |
---|---|---|
1 | -c | 只编译 ,不链接 为可执行文件,编译器 将输入的.c 文件编译为.o 的目标文件 |
2 | -o output_file | output_file 用来指定 编译结束以后的输出文件名 如果 不使用 这个选项的话 GCC 默认编译出来的可执行文件 名字为a.out |
3 | -E | 只对文件进行预处理 ,不编译汇编和链接 |
4 | -S | 只对文件进行编译 ,不汇编和链接 |
5 | -g | 产生符号调试工具(GNU 的 GDB)所必要的符号信息,要想对源代码 进行调试,就必须加入这个选项。 g 也分等级,默认是-g2 ,-g1 是最基本的,-g3 包含宏信息 |
6 | -O | 对程序进行优化编译 ,如果使用此选项的话整个源代码在编译 、链接 的的时候都会进行优化 ,这样产生的可执行文件 执行效率 就高 |
7 | -ON | 指定代码的优化等级为N ,可取值为 0,1,2,3O0 没有优化,O3 优化级别最高 |
8 | -O2 | 比-O 更幅度更大的优化,生成的可执行效率 更高,但是整个编译过程会很慢 |
4、C/C++ 程序 常用文件名后缀
序号 | 扩展名 | 说明 |
---|---|---|
1 | .a | 静态库 ,由目标文件 构成的文件库 |
2 | .c | C 源码,必须经过预处理 |
3 | .C .cc .cpp | C++ 源码,必须经过预处理 |
4 | .h | C/C++ 源码的头文件 |
5 | .i | .c 经过预处理 得到的C 源码 |
6 | .ii | .C .cc .cpp 经过预处理 得到的C++ 源码 |
7 | .s | 汇编语言 文件,是.i 文件编译 后得到的中间文件 |
8 | .o | 目标 文件,是编译 过程得到的中间文件 |
9 | .so | 共享对象库 (shared object),也称动态库 |
5、 链接 可分为 动态链接 和 静态链接
序号 | 链接 | 描述 |
---|---|---|
1 | 动态 链接 | 使用动态库 进行链接,生成的程序在执行的时候 需要加载 所需的动态库 才能运行。动态链接 生成的程序小巧,但是必须依赖动态库 ,否则无法执行 。 |
2 | 静态 链接 | 使用静态库 进行链接,生成的程序包含程序运行 所需要的全部库 ,可以直接运行 ,不过体积较大 。 |
Linux 下的动态链接库
实际是共享目标文件
(shared object),一般是.so
文件,作用类似于 Windows 下的.dll
文件。