【问题标题】:G++ issues "storage class specified" errors when using extern inline使用 extern inline 时 G++ 发出“指定存储类”错误
【发布时间】:2019-12-03 18:15:54
【问题描述】:

我使用链接时优化(g++ld 命令行中的-flto)并且我的一些方法声明(在标题中)被标记为extern inline(并且只是inline.cpp文件)。编译产量:

./Client/include/GVGLObjects.hpp:96:32: error: storage class specified for 'VertexBuffer'
             EFAST VertexBuffer();
                                ^

还有一堆其他方法和函数的类似错误。 EFAST 表示extern inline

为什么在启用 LTO 时会发生这种情况?如果不允许,如何将声明和定义与内联和 LTO 分开?

【问题讨论】:

  • C++ 中没有“外线”之类的东西,as per this answer。所以,摆脱它,让编译器和链接器完成它们的工作。
  • @SamVarshavchik "extern inline" 我想你的意思是?
  • 如果它在标题中,将其标记为内联,extern 在这里没有意义。

标签: c++ g++ lto


【解决方案1】:

extern inline 存在于 C 中,而不存在于 C++ 中,尽管许多编译器允许它作为扩展名 (ref)。

大概 GCC 用于执行 LTO (ref) 的任何机制和文件格式都与这个非标准的东西不兼容。 The documentation for -flive-patching=level 很有趣,因为它描述了与内联和存储类相关的内容,并告诉我们其中一些在使用 LTO 时不可用(尽管实际的 -flto 描述并没有特别提到 extern inline 扩展名) .

您可能不希望在 C++ 代码中使用此 EFAST 宏。

【讨论】:

  • 不幸的是,将EFAST 替换为FAST (inline) 会产生相同的结果。
  • @VladislavToncharov 不可能这样。显示的错误消息仅在指定存储类时才有意义,您现在声称没有这样做。
  • 哦,我的错。不小心看错了日志;当然不是。相反,它只是说“使用但从未定义的内联函数”,并且链接器抛出“未定义的引用”。
  • @VladislavToncharov 那么我们需要minimal reproducible example,但这是一个新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-19
相关资源
最近更新 更多