我对 gcc 4.5.2 中的 -O2 有疑问。假设我有这段代码:
//file.cpp
void test::f() {}
//file.h
struct test
{
inline void f();
};
此代码在共享库中。现在,当我在没有 -O2 的情况下编译时,它工作正常。使用 -O2 它表示 test::f() 是 undefined symbol 。显然 gcc 只是将其丢弃,因为它是“内联的”(尽管实际上不是)。
我的问题是什么具体的优化标志导致了这个?我的想法是我想启用 -O2 但禁用那个确切的标志,以便我可以保持内联不变(这不是我的代码)。
我可能只是迭代所有这些,但是,这也可以是链接器标志,对吧?这是太多的工作,我只希望有人能提供线索。
最佳答案
标准要求 inline
函数的定义出现在每个使用它的 TU 中。
要么删除 inline
,要么将函数的定义移动到头文件中。即使你想做的事情被允许,将函数标记为 inline
也没有任何好处。
碰巧在你的实现中你遇到了 -O2
的问题,但没有它显然没有问题。
关于c++ - O2 中导致 undefined symbol 的 gcc 优化标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13645268/