我在gcc 4.5.2中遇到-O2问题。说我有这段代码:
//file.cpp
void test::f() {}
//file.h
struct test
{
inline void f();
};
此代码位于共享库中。现在,当我编译没有-O2时,它工作正常。使用-O2时,它表示test :: f()是未定义的符号。显然gcc只是把它扔掉了,因为它是“内联的”(虽然它确实不是)。
我的问题是具体的优化标志会导致什么?我的想法是,我想启用-O2但禁用那个确切的标志,以便我可以保持内联不变(这不是我的代码)。
我可能只是迭代所有这些但是,这也可以是链接器标志,对吧?这是太多的工作,我只希望有人知道。
答案 0 :(得分:6)
该标准要求在使用它的每个TU中都存在inline
函数的定义。
删除inline
或者将函数的定义移动到头文件。即使你想要做的事情被允许,标记函数inline
也没有任何好处。
恰好在你的实施中你遇到-O2
的问题,但没有它就没问题。
答案 1 :(得分:2)
最好的解决方案是修复或拒绝损坏的代码。必须在使用它们的任何翻译单元中定义内联函数,并且此代码会破坏该规则。
如果这不是一个选项,那么-fkeep-inline-functions
可能会很好地修补问题以允许代码编译和链接。
答案 2 :(得分:0)
您可以使用标记gcc
强制inline
忽略-fno-inline
。