3

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

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

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

在 cpp 文件中:

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

当我在 cpp 文件的行上放置一个断点时,我看到它在一个名为“__static_initialization_and_destruction_0”的堆栈帧中调用它,如果我进入它,我可以看到它在达到 main 之前调用了这个映射的构造函数。在 main 启动之后,我通过库 API 的函数调用插入了一些条目,然后我注意到构造函数被第二次调用,其方式与第一次类似。

是什么导致了这种情况,或者是什么和我的误解可能让我感到困惑以至于认为这正在发生?我已经搜索过,但没有看到对构造函数的显式调用。我无法在最小的测试用例中复制它。我知道提供一个准确的答案是不可能的,但是任何能给我指明好的方向的东西都将不胜感激。

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

4

1 回答 1

0

这是可见性/符号版本问题。有多种方法可以纠正这一点。由于这仅存在于此操作系统上的此编译器中,因此我决定稍微更改头文件并自己维护更改。如果他们想要合并此更改,我将让图书馆的创建者知道。

有关符号可见性的更多详细信息,请访问: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;
于 2012-10-06T21:05:44.830 回答