2

我对 gcc 4.5.2 中的 -O2 有疑问。说我有这个代码:

//file.cpp
void test::f() {}
//file.h
struct test
{
    inline void f();
};

此代码在共享库中。现在,当我在没有 -O2 的情况下编译时,它工作正常。使用 -O2 表示 test::f() 是未定义的符号。显然 gcc 只是把它扔掉,因为它是“内联的”(尽管它实际上不是)。

我的问题是什么特定的优化标志会导致这种情况?这个想法是我想启用 -O2 但禁用该确切标志,以便我可以保持内联不受影响(这不是我的代码)。

我可能只是迭代所有这些,但是,这也可以是链接器标志,对吗?这工作太多了,我只希望有人能提供线索。

4

3 回答 3

6

该标准要求inline函数的定义存在于使用它的每个 TU 中。

删除inline或将函数的定义移动到头文件。即使您想要做的事情被允许,标记该功能也没有任何好处inline

碰巧的是,在您的实施中,您遇到了问题,-O2但没有它显然没有问题。

于 2012-11-30T12:35:00.727 回答
2

最好的解决方案是修复或拒绝损坏的代码。内联函数必须在任何使用它们的翻译单元中定义,而这段代码打破了这个规则。

如果这不是一个选项,那么-fkeep-inline-functions可能会很好地修补问题以允许代码编译和链接。

于 2012-11-30T12:40:55.083 回答
0

您可以使用 flag强制gcc忽略。inline-fno-inline

于 2012-11-30T12:31:09.380 回答