1

See document information: inline Methods Hidden GCC_INLINES_ARE_PRIVATE_EXTERN = YES When enabled, out-of-line copies of inline methods are declared 'private extern'.[GCC_INLINES_ARE_PRIVATE_EXTERN, -fvisibility-inlines-hidden

Does anyone know how it will effect undergoing C++ library? My iphone project is based on C++ library, using google protobuf, I find some strange issue that library inline function will not be triggered by "inline Methods Hidden" option set to YES, in fact it is system default value, set to NO it works well, I don't know why? What's the secret inside?

Anyone who are interested in this topic please share and discuss, thanks in advance.

4

1 回答 1

2

秘密是一个定义规则。如果内联被隐藏,那么您最终可能会在每个图像中获得多个(私有)内联副本。

理想情况下,您将配置和使用所有内容,以便它能够使用一个定义规则运行,然后您可以启用私有 externs 作为优化(这可能在各个方面都不是很好,尤其是二进制大小)。您会喜欢这种方法,因为它遵循标准的模型。

要快速了解 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 可见。链接器只保留一个定义,并且假定所有定义都相等。这很重要,因为如果每个被引用和可见的定义都会为每个 translate生成一个副本,那么您的二进制大小将会爆炸。

如果在使用 ODR 规则时它“有效”,那么很可能您的目标文件中有给定符号的多个定义,并且由于编译器设置,您最终会引用不同的定义。如果您声明了一个非静态或在匿名命名空间中的内联,则所有源文件的定义应该相同。

如果您将其与 C TU 混合使用,那么...它有不同的链接规则,这只会​​使问题进一步复杂化。

于 2011-12-05T04:51:37.543 回答