gcc实例-几个编译选项
从我们的平台的编译参数上,存在这么几个选项,其中mthumb对代码的size影响较大,下面做一一分析。该优化选项会牺牲部分编译速度,除了执行-O1所执行的所有优化之外,还会采用几乎所有的目标配置支持的优化算法,用以提高目标代码的运行速度。-O, -O1:这两个命令的效果是一样的,目的都是在不影响编译速度的前提下,尽量采用一些优化算法降低代码大小和可执行代码的运行速度。-O3该选项除了执行-O2所有
从我们的平台的编译参数上,存在这么几个选项,其中mthumb对代码的size影响较大,下面做一一分析。
-O2 -pipe -g -march=armv7-a -mthumb
-O2
该优化选项会牺牲部分编译速度,除了执行-O1所执行的所有优化之外,还会采用几乎所有的目标配置支持的优化算法,用以提高目标代码的运行速度。
-
-O, -O1:这两个命令的效果是一样的,目的都是在不影响编译速度的前提下,尽量采用一些优化算法降低代码大小和可执行代码的运行速度。
-
-O3该选项除了执行-O2所有的优化选项之外,一般都是采取很多向量化算法,提高代码的并行执行程度,利用现代CPU中的流水线,Cache等。
-
-Os这个优化标识和-O3有异曲同工之妙,当然两者的目标不一样,-O3的目标是宁愿增加目标代码的大小,也要拼命的提高运行速度,但是这个选项是在-O2的基础之上,尽量的降低目标代码的大小,这对于存储容量很小的设备来说非常重要。
-
-Ofast该选项将不会严格遵循语言标准,除了启用所有的-O3优化选项之外,也会针对某些语言启用部分优化。
-
-Og该标识会精心挑选部分与-g选项不冲突的优化选项,当然就能提供合理的优化水平,同时产生较好的可调试信息和对语言标准的遵循程度。
-march
编译代码时,按照arch参数指定的cpu架构进行编译。
-mthumb
使用这个编译选项生成的目标文件是Thumb指令。
thumb指令集是arm指令集的一个子集,是针对代码密度问题而提出的,它具有16位的代码宽度。与等价的32位代码相比较,thumb指令集在保留32位代码优势的同时,大大的节省了系统的存储空间。
Thumb指令集和ARM指令集比较
-
ARM处理器支持两种指令集:ARM指令集和Thumb指令集。
-
ARM指令集指令长度为32位,Thumb指令集指令长度为16位。在16位外部数据总线宽度下,ARM处理器上使用Thumb指令的性能要比使用ARM指令的性能更好。
-
Thumb指令兼容数据总线宽度为16为的应用系统。
-g选项
目的
生成供符号调试器使用的调试信息。
并使程序状态可用于所选源位置的调试会话,程序状态指的是程序执行过程中某些点的用户变量的值。
您可以使用不同的-g levels来平衡调试功能和编译器优化。
较高的-g levels提供更完整的调试支持,但会牺牲运行时或可能的编译时性能,而较低的-g levels会提供更高的运行时性能,但会牺牲调试会话中的某些功能。
当-O2优化级别生效时,完全支持调试功能。
当高于-O2的优化级别生效时,调试功能会受到限制。
默认值
如果未指定-g ,则-g0生效,这意味着编译器不会生成任何调试信息或保留程序状态。
如果指定-g,则默认值如下:
-
当未启用优化时 ( -qnoopt ),
- g等同于-g9。 -
当
-O2优化级别生效时,-g等同于-g2。
参数
-
-g0
不生成调试信息,不保留任何程序状态。 -
-g1
生成有关行号和源文件名的最少只读调试信息,不保留任何程序状态,此选项等效于-qlinedebug。 -
-g2
生成有关行号、源文件名和变量的只读调试信息。
当-O2 或更高优化级别生效时,不会保留任何程序状态。 -
-g8
生成有关行号、源文件名和变量的只读调试信息。当-O2优化级别生效时:
- 在每个可执行语句的开头,程序状态对调试器可用。
- 函数参数值在每个函数的开头可供调试器使用。
- 支持调试内联函数。
-
-g9
生成有关行号、源文件名和变量的调试信息,可以在调试器中修改变量的值。当-O2优化级别生效时:
- 在每个可执行语句的开头,程序状态对调试器可用。
- 函数参数值在每个函数的开头可供调试器使用。
- 支持调试内联函数。
-pipe
-pipe, --pipe
Use pipes between commands, when possible
此标志对生成的代码没有影响,但它使编译过程更快。它告诉编译器在编译的不同阶段使用管道而不是临时文件,这样会占用更多内存。
更多推荐


所有评论(0)