GCC:对链接器使用-O3优化标志

GCC:对链接器使用-O3优化标志,gcc,optimization,g++,Gcc,Optimization,G++,我在Linux 14.04 x64上使用g++4.8.4。在编译和链接期间,我使用-O3和-flto标志编译我的项目,即我的Makefile中的CFLAGS和LDFLAGS都有这些选项 我刚刚发现,当涉及浮点/双精度的计算时,优化的二进制文件的行为不同(即错误)。仅从LDFLAGS中删除-O3似乎就能解决问题 我记得在某个地方读到,为编译器和链接器指定相同的优化标志集通常是安全的。我的理解错了吗?提前感谢。在使用LTO时,编译器在编译步骤中将中间代码表示(也称为GIMPLE)转储到目标文件的特殊

我在Linux 14.04 x64上使用g++4.8.4。在编译和链接期间,我使用-O3和-flto标志编译我的项目,即我的Makefile中的CFLAGS和LDFLAGS都有这些选项

我刚刚发现,当涉及浮点/双精度的计算时,优化的二进制文件的行为不同(即错误)。仅从LDFLAGS中删除-O3似乎就能解决问题


我记得在某个地方读到,为编译器和链接器指定相同的优化标志集通常是安全的。我的理解错了吗?提前感谢。

在使用LTO时,编译器在编译步骤中将中间代码表示(也称为GIMPLE)转储到目标文件的特殊部分

机器代码的实际编译和优化发生在链接阶段

所以是的,如果您的代码导致UB或只是使用-O3选项进行了错误优化,那么如果您将其更改为-O0,-Og等,它的行为可能会有所不同(如预期的那样)


因此,您必须找出是您的代码行为不当,还是实际的GCC LTO错误

没有“Linux 14.04”。也许你是指Ubuntu14.04?我的道歉-之前不小心跳过了“Ubuntu”如果你使用LTO做事情,并且某些错误的优化只应用于O3,那么——宾果游戏——从最后一步删除O3将强制将整个代码重新编译到O0或其他东西,并且不会触发错误的选项。明白了。让我试着不用“-flto”单独查看。但是,我给编译器和链接器都加了“-O3”标志,对吗?@srivathsan是的,应该给编译器和链接器加上与答案相同的“Severin Pappadeux”标志,因为从我删除“-flto”标志时起,我的项目就没有崩溃。即使是“-O3”优化也可以在没有“-flto”的情况下正常工作。因此,在Ubuntu14.04 x64上的GCC4.8.4中,它似乎确实是一个LTO错误。不过,我还没有尝试过GCC 5.x和最新的6.2