总结GCC的部分编译选项

gcc在执行编译工作的时候,总共需要4步:
1.预处理,生成.i的文件
2.将预处理后的文件不转换成汇编语言,生成文件.s
3.有汇编变为目标代码(机器代码)生 成.o的文件
4.连接目标代码,生成可执行程序

gcc部分参数详情:
-c
只激活预处理,编译,和汇编,也就是他只把程序做成obj文件
例子用法:
gcc -c hello.c
他将生成.o的obj文件

-S
只激活预处理和编译,就是指把文件编译成为汇编代码。
例子用法:
gcc -S hello.c
他将生成.s的汇编代码,你可以用文本编辑器察看

-E
只激活预处理,这个不生成文 件,你需要把它重定向到一个输出文件里面.
例子用法:
gcc -E hello.c

-o
制定目标名称,缺省的时候,gcc 编译出来的文件是a.out
例子用法:
gcc -o hello -S hello.c

-w
关闭编译时的警告,就是编译后不显示任何的warning,有时在编译之后编译器会显示一些数据转换之类的警告,这些警告是我们平时可以忽略的。
gcc -w main.c

-W
类似-Wall,会显示警告,但是只是显示编译器认为会出现错误的警告

-Wall
输出所有的警告
实际上-Wall是一系列警告编译选项的集合,里面有很多更加详细的针对某一错误的编译选项(-Wcomment、-Wformat、-Winplicit…)

-g和-ggdb
都是令gcc生成调试信息,但是有区别
-g可以利用操作系统的“原生格式”生成调试信息,GDB可以直接利用这个信息,其他调试器也可以使用这个调试信息
-ggdb是使GCC为GDB生成专用的更为丰富的调试信息,但是,此时就不能用其他的调试器来进行调试了
-g和-ggdb有分级别:
-g2这是默认级别,此时产生的调试信息包括扩展的符号表、行号、局部或外部变量信息。
-g3包含级别2中的所有调试信息,以及源代码中定义的宏
-g1是不包含局部变量和与行号有关的调试信息,因此只能够用于回溯跟踪和堆栈转储之用。回溯跟踪指的是监视程序在运行过程中的函数调用历史,堆栈转储则是一种以原始的十六进制格式保存程序执行环境的方法,两者都是经常用到的调试手段。

-I:指定头文件路径,可以是相对路径,也可以是绝对路径

-i:指定头文件名字(不常用)

-L:指定连接的动态库或者静态库路径,可以是相对路径,也可以是绝对路径

-l:指定需要链接的库的名字

-static:在支持动态链接的系统上,阻止连接共享库。该选项在其它系统上无效。

------------------------------------------------------------------------------------------------------------------l
gcc默认提供了5级优化选项的集合:
-O0:无优化(默认)

-O和-O1:使用能减少目标文件大小以及执行时间并且不会使编译时间明显增加的优化.在编译大型程序的时候会显著增加编译时内存的使用
-O1包含的选项通常可以和安全的、调试的选项一起使用:
-fauto-inc-dec -fcprop-registers -fdce -fdefer-pop -fdelayed-branch
-fdse -fguess-branch-probability -fif-conversion2 -fif-conversion
-finline-small-functions -fipa-pure-const -fipa-reference
-fmerge-constants -fsplit-wide-types -ftree-ccp -ftree-ch
-ftree-copyrename -ftree-dce -ftree-dominator-opts -ftree-dse
-ftree-fre -ftree-sra -ftree-ter -funit-at-a-time

-O2:该优化选项会牺牲部分编译速度,除了执行-O1所执行的所有优化之外,还会采用几乎所有的目标配置支持的优化算法,用以提高目标代码的运行速度。
以下是-O2在-O1基础上增加的优化选项:
-falign-functions -falign-jumps -falign-loops -falign-labels
-fcaller-saves -fcrossjumping -fcse-follow-jumps -fcse-skip-blocks
-fdelete-null-pointer-checks -fexpensive-optimizations -fgcse
-fgcse-lm -foptimize-sibling-calls -fpeephole2 -fregmove
-freorder-blocks -freorder-functions -frerun-cse-after-loop
-fsched-interblock -fsched-spec -fschedule-insns
-fschedule-insns2 -fstrict-aliasing -fstrict-overflow -ftree-pre
-ftree-vrp

-O3:打开所有-O2的优化选项并且增加 -finline-functions, -funswitch-loops,-fpredictive-commoning, -fgcse-after-reload and -ftree-vectorize优化选项.该选项除了执行-O2所有的优化选项之外,一般都是采取很多向量化算法,提高代码的并行执行程度,利用现代CPU中的流水线,Cache等。这个选项会提高执行代码的大小,当然会降低目标代码的执行时间

-Os:专门优化目标文件大小,执行所有的不增加目标文件大小的-O2优化选项.并且执行专门减小目标文件大小的优化选项.这个优化标识和-O3有异曲同工之妙,当然两者的目标不一样,-O3的目标是宁愿增加目标代码的大小,也要拼命的提高运行速度,但是这个选项是在-O2的基础之上,尽量的降低目标代码的大小,这对于存储容量很小的设备来说非常重要。
为了降低目标代码大小,会禁用下列优化选项,一般就是压缩内存中的对齐空白
-falign-functions
-falign-jumps
-falign-loops
-falign-labels
-freorder-blocks
-freorder-blocks-algorithm=stc
-freorder-blocks-and-partition
-fprefetch-loop-arrays

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值