Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我相信-O2标志导致我必须在每台机器上重新编译。为什么?_C++_Gcc_Optimization_G++_Openframeworks - Fatal编程技术网

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

C++ 我相信-O2标志导致我必须在每台机器上重新编译。为什么?,c++,gcc,optimization,g++,openframeworks,C++,Gcc,Optimization,G++,Openframeworks,我正在使用库(openFrameworks)构建一个项目,编译器中为发布目标设置的默认选项包括-O2标志,我从未使用过该标志。直到最近,我还没有想到这一点,因为一切似乎都在运转。然后,我开始在开发中没有使用的机器上进行测试,程序崩溃了(甚至没有用到我的任何调试语句) 在目标机器上重新编译可以使可执行文件正常工作。-O2标志是否可能导致这种情况?在目标机器上重新编译时,我没有收到任何错误或警告,因此我不太清楚为什么会发生这种情况。我之所以怀疑-O2标志,是因为它是我在项目中唯一一个从未使用过且已启

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

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

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


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

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

“-O2”打开由“-O”指定的所有优化标志。它还打开以下优化标志: -fforce mem-优化同级调用-fstrength reduce-fcse跟随跳转-fcse跳过块-frerun cse after loop opt-fgcse-fgcse lm-fgcse sm-fdelete空指针检查-开销优化-fregmove-fschedule insns-fschedule-insns2-fsched interblock-fsched spec-fcaller saves-fpeephole2-freorder块-freorder函数-fstrict别名-falign函数-falign跳跃-falign循环-falign标签


结果是,任何架构或操作系统差异都将导致内存故障或坏分支。当您获取经过优化的编译可执行文件或库时,它将利用该平台上所有可用的特定硬件。如果您有一个苹果对苹果的硬件比较,并且操作系统都是相同的,那么您有机会让它工作,但即使这样,在运行时尝试之前也很难做出决定。问题在于,它取决于编译器的具体情况,并且不是通用的

我怀疑这是编译器标志的问题,许多项目默认使用
-O2
。我敢打赌没有定义的行为。也就是说,根据你提供的信息,没有办法找到任何真正的答案。问题是我不知道问题会在哪里,而且发布代码页面也不是很有建设性。有什么我可以做的会有帮助吗?用调试器逐步完成它。在
main()
处设置一个断点,然后向前走,直到找到断裂的东西。如果它在到达
main()
之前就崩溃了,那只能是静态(全局)变量初始化的问题,因为它们是唯一在main之前运行的东西。或者实际上是-O2的问题,我仍然觉得这不太可能。尝试一下clangs(我认为gcc现在已经有了它)消毒剂(
-fsanizize=undefined
用于未定义的行为,
=memory
用于与内存相关的,…)阅读他们的手册。用
gcc-dumpmachine
检查您正在编译的体系结构。额外的优化标志可以假设某个cpu指令存在,因为在目标机器上没有架构设置。修复编译用<代码> -3/<代码>和正确的体系结构(找到正确的体系结构,运行目标机器上的PREV命令)。C++通常编译成本机代码,自然地不在不同的OSES上工作,如Windows Mac,不需要重新编译。也就是说,
-O2
中没有任何东西会降低它的可移植性,我经常在Windows 7、8和XP中使用使用
-O2
-O3
编译的软件,没有任何问题。这很公平。我想我应该发表评论而不是回答。我有一个优化的原因导致这种不一致的行为,但我想这是一个不同的操作系统组合。可能更可能是未初始化的全局,这取决于不同运行的内存状态。我只想注意,即使是更专业的
-mtune=architecture
也会为一个特定的体系结构调整代码,但仍然允许其他体系结构通过具有多个不同的代码路径来运行代码。使其完全依赖于某个体系结构的唯一方法是
-march=architecture
,它告诉它只针对一个指定的体系结构进行优化和编译。快速问题:你是说
-march=architecture
会导致它无法在其他机器上工作吗?项目中似乎启用了
-march=native
。正确
-march=native
将允许GCC使用编译机器上可用的任何指令。稍旧一点的机器将无法运行该软件。为
-march=architecture
选择一个值,该值表示您希望能够在其上运行的最旧处理器。