O2中导致未定义符号的gcc优化标志

时间:2012-11-30 12:28:08

标签: c++ optimization gcc

我在gcc 4.5.2中遇到-O2问题。说我有这段代码:

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

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

我的问题是具体的优化标志会导致什么?我的想法是,我想启用-O2但禁用那个确切的标志,以便我可以保持内联不变(这不是我的代码)。

我可能只是迭代所有这些但是,这也可以是链接器标志,对吧?这是太多的工作,我只希望有人知道。

3 个答案:

答案 0 :(得分:6)

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

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

恰好在你的实施中你遇到-O2的问题,但没有它就没问题。

答案 1 :(得分:2)

最好的解决方案是修复或拒绝损坏的代码。必须在使用它们的任何翻译单元中定义内联函数,并且此代码会破坏该规则。

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

答案 2 :(得分:0)

您可以使用标记gcc强制inline忽略-fno-inline