我使用链接时优化(-flto
和g++
命令行中的ld
),并且我的一些方法声明(在标题中)被标记为extern inline
(并且inline
个文件中仅.cpp
个文件)。编译产量:
./Client/include/GVGLObjects.hpp:96:32: error: storage class specified for 'VertexBuffer'
EFAST VertexBuffer();
^
以及其他方法和函数的类似错误。 EFAST
的意思是extern inline
。
为什么启用LTO会发生这种情况?如果不允许这样做,如何用内联和LTO分隔声明和定义?
答案 0 :(得分:1)
extern inline
存在于C中,而不存在于C ++中,尽管许多编译器允许它作为扩展名(ref)。
GCC用来执行LTO(ref)的任何机制和文件格式都可能与此非标准的东西不兼容。 The documentation for -flive-patching=level
很有趣,因为它描述了与内联和存储类有关的内容,并告诉我们在使用LTO时其中某些内容不可用(尽管实际的-flto
描述并未明确指出{ {1}}扩展名)。
您可能不希望在C ++代码中使用此extern inline
宏。