文章目录
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文件。
&spm=1001.2101.3001.5002&articleId=89819690&d=1&t=3&u=5e391ef8a0074a7bbaff076d40e4ec79)
5710

被折叠的 条评论
为什么被折叠?



