查看文件信息: 隐藏的内联方法 GCC_INLINES_ARE_PRIVATE_EXTERN = YES 启用后,内联方法的外联副本将被声明为“private extern”。[GCC_INLINES_ARE_PRIVATE_EXTERN,-fvisibility-inlines-hidden
有谁知道它将如何影响C ++库?我的iphone项目基于C ++库,使用google protobuf,我发现一些奇怪的问题,即内联函数不会被“内联方法隐藏”选项设置为YES触发,实际上它是系统默认值,设置为NO它有效好吧,我不知道为什么?里面的秘密是什么?
任何对此主题感兴趣的人请提前分享和讨论。
答案 0 :(得分:2)
秘密是一个定义规则。如果隐藏了内联,那么每个图像最终可能会有多个(私有)内联副本。
理想情况下,您可以配置和使用所有内容,以便它能够使用一个定义规则运行,然后您可以启用私有外部作为优化(在各方面都可能不太好,特别是二进制大小)。你会赞成这种方法,因为它遵循标准的模型。
快速了解ODR:
// somewhere.hpp
namespace MON {
inline int cas(const int*,const int*,int*) {
return dah_dum();
}}
// elsewhere.hpp
namespace MON {
inline int cas(const int*,const int*,int*) {
return dum_dah();
}}
任何未完全或部分内联的int MON::cas(const int*,const int*,int*)
引用,但对int MON::cas(const int*,const int*,int*)
的函数调用可能导致使用任一定义,无论TU可以看到哪个定义。链接器保留了一个定义,并假设所有定义都相同。这很重要,因为如果每个引用和可见的定义都会为每个翻译生成 ,那么二进制大小会爆炸。
如果在使用ODR规则时它“有效”,那么您可能在目标文件中对给定符号有多个定义,并且由于编译器设置,您最终会引用不同的定义。如果您声明了一个非静态的内联或匿名命名空间,则所有源文件的定义应该相同。
如果你将它与C TU混合使用,那么......它有不同的链接规则,这只会使问题进一步复杂化。