我试图了解如何关闭使用GCC编译的特定优化标志。我知道有些标志有一个-fno
选项,但大多数标志都没有(从我看到的)。我正在尝试使用-O1
标志编译程序,但是为每次编译删除-O1
中的一个标志。
例如; -fauto-inc-dec
没有等效的-fno-auto-inc-dec
标记,我可以将其传递给-O1 -fno-auto-inc-dec
这样的参数。
想要使用-O1
选项进行编译,但请关闭-O1
给出的具体选项,以查看导致的差异。
任何帮助将不胜感激,不幸的是我是新手,所以我非常初学。
答案 0 :(得分:4)
如man gcc
中所述:
Most optimizations are only enabled if an -O level is set on
the command line. Otherwise they are disabled,
even if individual optimization flags are specified.
所以基本上不传递任何-O
标志,你不能使用可配置的优化。
此外,-O1
不是默认设置,-O0
是。
您也可以从相反的方向开始,禁用所有优化并启用"批次"手动,即查看gcc -Q --help=optimizers
,看看在哪个级别启用了哪些优化并剥离它们。
为了解决您-O*
选项启用未列出标记的问题,我要说它是一个手册页。在特定体系结构上主动查询编译器应该为您提供一个详尽的优化列表,该列表将使用特定的-O
标志启用,因此将-O0
与这些列表结合使用flags 应该产生完全相同的结果。
答案 1 :(得分:2)
为什么不走另一条路呢?使用-O0
关闭所有优化并有选择地启用它们。
或者如果您希望逐个禁用它们,请从:
开始CFLAGS=-O0 \
-fauto-inc-dec \
-fcompare-elim -fcprop-registers \
-fdce -fdefer-pop -fdelayed-branch -fdse \
-fguess-branch-probability \
-fif-conversion2 -fif-conversion \
-fipa-pure-const -fipa-profile -fipa-reference \
-fmerge-constants \
-fsplit-wide-types \
-ftree-bit-ccp -ftree-builtin-call-dce -ftree-ccp -ftree-ch \
-ftree-copyrename -ftree-dce -ftree-dominator-opts -ftree-dse \
-ftree-forwprop -ftree-fre -ftree-phiprop -ftree-slsr -ftree-sra \
-ftree-pta -ftree-ter \
-funit-at-a-time
(顺便说一句,所有这些信息均来自man gcc
)