我相信-O2标志导致我必须在每台机器上重新编译。为什么?

时间:2014-12-10 22:03:18

标签: c++ gcc optimization g++ openframeworks

我正在使用库(openFrameworks)构建项目,并且在编译器中为发布目标设置的默认选项包括-O2标志,这是我从未使用过的。直到最近,我一无所知,因为一切似乎都在起作用。然后我开始测试未在开发中使用的机器,程序崩溃了(它甚至没有得到我的任何调试语句)。

目标计算机本身的重新编译使可执行文件正常工作。 -O2标志是否可能导致此问题?在目标计算机上重新编译时,我没有收到任何错误或警告,所以我不确定为什么会这样。我怀疑-O2标志的原因是因为它是我从未使用过的唯一一个在项目中启用的标志。

我还没有测试它是否发生在-O1-O3标志中。

我在Windows 7上,所有测试都在Windows 7和Windows 8系统上,使用Code :: Blocks中的MinGW(TDM-GCC)4.8.1进行编译。

1 个答案:

答案 0 :(得分:-2)

-O2标志:优化甚至超过-O标志。 GCC几乎执行所有支持的优化,不涉及空速 - 权衡。指定'-O2'时,编译器不执行循环展开或函数内联。与'-O'相比,此选项增加了编译时间和生成代码的性能。

' - O2'打开'-O'指定的所有优化标志。它还会打开以下优化标志: -fforce-mem -foptimize-sibling-calls -fstrength-reduce -fcse-follow-jumps -fcse-skip-blocks -frerun-cse-after-loop -frerun-loop-opt -fgcse -fgcse-lm -fgcse-sm -fdelete-null-pointer-checks -fexpensive-optimizations -fregmove -fschedule-insns -fschedule-insns2 -fsched -interblock -fsched-spec -fcaller-saves -fpeephole2 -freorder-blocks -freorder-functions -fstrict-aliasing -falign -functions -falign-jumps -falign-loops -falign-labels

结果是任何体系结构或操作系统差异都会导致内存故障或坏分支。当您获取经过优化的已编译可执行文件或库时,它将使用该平台上可用的所有特定硬件。如果你有一个完全相同的苹果到苹果硬件比较和操作系统,那么你就可以开始工作了,但即便如此,在运行时尝试它之前很难做出决定。问题是它依赖于编译器的细节而不是一般化的。