c++ - O2 中导致 undefined symbol 的 gcc 优化标志

标签 c++ optimization gcc

我对 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/

相关文章:

c++ - 阻止代码处理的宏

转换为连续 if 语句的无分支

c++ - 为什么结果输出是整数即使结果被定义为 float ?

c++ - 可变线程与非常量方法

c++ - 中间指针的动态对齐(16 字节)

optimization - 在 TensorFlow 中进行多 GPU 训练有什么优势?

gcc - 用clang编译时无法查看std::string

linux - 如何将备用 glibc 与现有的 libstdc++ 一起使用?

linux - linux ubuntu 16 32bit 上,DrPaulcarter 汇编语言教程,undefined reference 错误

c++ - Qt中如何检查文件是否被数据库驱动占用