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

que*_*en3 1 c++ optimization gcc

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

//file.cpp
void test::f() {}
//file.h
struct test
{
    inline void f();
};
Run Code Online (Sandbox Code Playgroud)

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

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

我可以只迭代所有这些,但是,这也可以是链接器标志,对吧?这是太多的工作,我只希望有人会有线索.

Ste*_*sop 6

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

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

-O2事实上,在您的实施中您遇到了问题,但没有它就显然没有问题.