2014-01-19 118 views
1

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

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

现在我试着做他们提到关于-O1标志列表相同,但不幸的是它似乎并不是所有的标志所提到的,或者有一些隐藏标志被启用,因为当我编译只有-O1标志或只提供了一个f列表滞后(没有把-O1本身),我得到不同的编译结果,我的二进制文件拒绝只与特定-O1标志工作,所以我无法找到确切滋事选项。

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

+7

这听起来像你调用未定义的行为。也许最好是启用-Wall和-Wextra并尝试更正代码? – EOF

+0

您的代码中可能存在副作用,序列点和/或(un)严格别名。 – wildplasser

+0

gcc 4.4.2很早就发布了。你为什么不试试gcc 4.8或更新版本 –

回答

0

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