本专栏总结王利涛《C语言嵌入式Linux高级编程》第三期课程
一、gcc是个啥东西?
- gcc不仅仅是个“编译器”;
- gcc是GNU编译器套件,英文全称:GNU Compiler Collection;
- gcc包含预处理器、编译器、汇编器、链接器;
- gcc也包含各种文件处理工具:objump、objcopy、nm、readelf、strip;
- 自带各种库、头文件。
二、gcc编译工具链
1)通过参数调用不同的工具
- -E:预处理,会调用cpp预处理器;
- -S:生成汇编文件,gcc合并预编译和编译,调用ccl程序完成;
- -C:生成目标文件,调用汇编器as。
2)查看gcc工作流程
- gcc --verbose
3)各种参数的作用
- 控制编译器过程;
- 编译选项控制;
- 编译器优化选项。
编译过程控制
参数 | 说明 |
---|---|
-E | 预处理,但不生成文件:gcc -E main.c -o main.i |
-C | 预处理,不删除注释信息 |
-S | 只激活预处理和编译,生成汇编代码 |
-c | 将源文件编译成目标文件,但不链接 |
-o | 输出目标名称,gcc默认编译出来的文件是a.out |
-M | 生成文件关联依赖关系 |
-MD | 和-M相同,但是将输出导入到 .d 文件里面 |
-MM | 生成文件关联依赖关系,但忽略#include<file.h>产生的依赖关系 |
编译选项设置
参数 | 说明 |
---|---|
-g | 编译时产生调式信息 |
-static | 禁止使用动态库 |
-share | 尽量使用动态库 |
-Ldir | 指定库搜索路径,默认编译器只在标准库的目录寻找 |
-llibname | 指定编译时使用的库。 |
-share | 生成共享目标文件 |
-w | 不生成任何警告信息 |
-Wall | 生成所有警告信息 |
-std:c99 | 指定c标准,gcc默认的标准是GNU C |
编译优化选项
参数 | 说明 |
---|---|
-O0 | 编译器关闭所有优化选项,编译时不会优化代码 |
-O1 | 缺省值 |
-O2 | 推荐的优化等级:提高代码性能的同时,不会增加文件体积 |
-O3 | 最高级别优化,不建议使用 |
-Os | 优化代码尺寸,适合存储资源紧张的系统,不推荐使用 |
- 注意:编译时,不要使用最高优化选项,可能会发生莫名其妙的错误、UB行为。不要盲目相信编译器,编译器也有bug。
- 其它更多的参数,可查阅gcc中文手册。