不可见的 GCC 优化标志?

Posted

技术标签:

【中文标题】不可见的 GCC 优化标志?【英文标题】:Invisible GCC optimization flags? 【发布时间】:2014-01-19 14:50:06 【问题描述】:

我正在使用 GCC 4.4.2 构建一些大型项目。由于我想构建它以供发布,我使用-O1 GCC 优化标志,但不幸的是它以某种方式与我的代码混淆,并且最终的二进制文件无法按预期工作,当使用-O0 标志(或没有优化)构建时一切工作正常。 我之前的项目也遇到过类似的问题,当时是-fstrict-aliasing 标志在-O2 优化级别上引起了麻烦,我设法通过搜索所有标志来发现它是由该特定标志引起的本文档中提到了关于-O2 优化级别:

http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Optimize-Options.html

现在我尝试对他们提到的关于 -O1 标志的列表做同样的事情,但不幸的是,似乎并非所有提到的标志,或者启用了一些隐藏标志,因为当我只使用 @987654328 编译时@ 标志或仅使用提供的标志列表(不放置 -O1 本身)我得到不同的编译结果,并且我的二进制文件拒绝仅使用特定的 -O1 标志,所以我找不到确切的故障排除选项.

是否有可能知道-O1 选项包含哪些隐藏选项,以及如何禁用其中一些选项?

【问题讨论】:

听起来你在调用未定义的行为。也许启用 -Wall 和 -Wextra 并尝试更正代码会更好? 代码中最有可能的副作用、序列点和/或(非)严格别名。 gcc 4.4.2 很久以前就发布了。为什么不试试 gcc 4.8 或更高版本 有很多事情是根据优化级别完成的,没有任何单独的匹配标志。最好修复你的代码,而不是试图找到隐藏错误的编译器标志。 【参考方案1】:

您可以在一个小的 C 文件上运行 gcc -Q -v 以让 GCC 转储正在使用的选项。 在有和没有-O1 选项的情况下运行它,以获得启用的选项之间的差异。

【讨论】:

以上是关于不可见的 GCC 优化标志?的主要内容,如果未能解决你的问题,请参考以下文章

GCC 优化标志

嵌入式 GCC 优化魔法

Mac OS X 上的 GCC 标志 -Os 来自哪里?

O2 中导致未定义符号的 gcc 优化标志

不要在 GCC 中使用 -O3 标志优化特定循环 [关闭]

哪个 gcc O2 标志可能导致 fp 计算失败?