【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
很多同学喜欢看代码,比如操作系统、数据库、脚本语言、android、虚拟软件什么的。但是却很少人会喜欢去研究编译器、连接器。其实编译器非常重要。一方面,它可以用来支持os、middle ware、app等各种软件的编译,另一方面它可以支持调试、调优和系统性能分析。这些额外生成的信息对于readelf、nm、strip、objdump、gdb非常有用。下面,我们就说说gcc&g++常用的一些选项。
1、-c
编译c文件
2、-o
生成目标文件
3、-S
将c文件生成汇编文件
4、-include
包含特定头文件
5、-I(大写的i)
指明头文件目录
6、-l(小写的l)
指明具体的动态库名称
7、-L
指明动态库目录
8、-D
添加默认macro定义
9、-static
强制生成一个exe文件,不依赖动态库,调试动态库问题时非常有效
10、-shared -fPIC
生成动态库
11、-g
生成调试信息
12、-Werror
将warning看成是error,代码静态检查的时候非常有效
13、-O1, -O2, -O3
基于速度的优化
14、-Os
基于大小的优化
15、-M
获取当前文件依赖的头文件,编写Makefile的时候非常有效
16、-E
完成文件预处理,此选项可以完成macro的翻译
17、-fprofile-arcs -ftest-coverage
在每一行代码后生成统计信息,用于gcov,主要分析代码覆盖率等
18、-pg
在一个函数的入口和出口添加额外代码,用于gprof,主要分析代码性能,kernel中ftrace的静态分析也是这个原理
19、-T
确认lds连接脚本
20、-nostartfiles -nostdlib
没有起始文件,没有标准库,此选项主要用于firmware的编译,不依赖于os
21、-m32, -m64
生成32位程序,生成64位程序
22、-std=c99
确定c或者cpp语言支持的语法标准
23、-v
显示编译全过程
24、--help
显示帮助信息,如果实在记不得了,就用用这个选项好了