构造函数在static std :: map上调用了两次

时间:2012-10-04 13:11:10

标签: c++ static constructor ogre3d

我确信我做错了,以实现这一目标。我正在使用一个库,它以一种似乎有意义的方式静态地声明了一个地图。

在标题中,在名为Codec的类中:

    typedef map< String, Codec* >::type CodecList; 
    static CodecList msMapCodecs;

在cpp文件中:

    map< String, Codec * >::type Codec::msMapCodecs;

当我在cpp文件的行上放置一个断点时,我看到它在一个名为&#34; __ static_initialization_and_destruction_0&#34;的堆栈帧中调用它。如果我进入它,我可以看到它在到达main之前调用此地图的构造函数。在主要启动之后,我通过库API的函数调用插入一些条目,然后我注意到第二次以类似于第一次的方式调用构造函数。

什么可能导致这种情况,或者什么和我误解,这可能会让我感到困惑,认为这种情况正在发生?我搜索过,但是我没有看到对构造函数的显式调用。我无法在最小的测试用例中复制它。我知道提供一个确切的答案是不可能的,但任何能指出我良好方向的事都将受到赞赏。

如果重要的话我在Ubuntu 12.04上使用gcc 4.6.3。 64

1 个答案:

答案 0 :(得分:0)

这是一个可见性/符号版本问题。有多种方法可以纠正这个问题。由于这只存在于此OS上的此编译器,因此我决定稍微更改头文件并自行维护更改。我会让图书馆的创作者知道,以防他们想要加入这一变化。

有关符号可见性的更多详细信息,请访问:http://gcc.gnu.org/wiki/Visibility

以下是我对代码所做的更改:

#if __GNUC__ >= 4
    // This block will be included only will the compiler
    #define DLL_LOCAL  __attribute__ ((visibility ("hidden")))
#else
    #define DLL_LOCAL
#endif

// <- Some details omitted here

typedef map< String, Codec* >::type CodecList; 
DLL_LOCAL static CodecList msMapCodecs;