我相信 -O2 标志导致我不得不在每台机器上重新编译.为什么

I believe the -O2 flag is causing me to have to recompile on each machine. Why?

本文关键字:新编译 为什么 编译 机器 标志 -O2 不得不 我相信      更新时间:2023-10-16

我正在使用库(openFrameworks(构建一个项目,编译器中为发布目标设置的默认选项包括-O2标志,我从未使用过。直到最近,我什么也没想,因为一切似乎都在正常。然后,我开始在未用于开发的机器上进行测试,程序崩溃了(它甚至没有到达我的任何调试语句(。

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

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

我在Windows 7

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

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

"-

O2"打开由"-O"指定的所有优化标志。它还会打开以下优化标志:-fforce-mem -foptimize-sibling-call -fstrength-reduce -fcse-follow-jumps -fcse-skip-blocks -frerun-cse-after-loop -frerun-loop-opt -fgcse -fgcse-lm -fgcse-sm -fdelete-null-pointer-check -fexpensive-optimization -fregmove -fschedule-insns -fschedule-insns2 -fsched-interblock -fsched-spec -fcaller-save -fpeephole2 -freorder-blocks -freorder-function -fstrict-aliasing -falign-function -falign-jumps -falign-loops -falign-label

结果是,任何体系结构或操作系统差异都会导致内存故障或分支错误。 当您使用经过优化的编译可执行文件或库时,它将利用该平台上可用的所有特定硬件。 如果你有一个苹果对苹果的硬件比较和操作系统都是相同的,你有一个机会让它工作,但即便如此,在运行时尝试之前也很难做出决定。 问题是它依赖于编译器的细节,而不是通用的。

相关文章: