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 が開始された直後に、ライブラリ API の関数呼び出しを介していくつかのエントリを挿入すると、コンストラクターが 1 回目と同様の方法で 2 回目に呼び出されることに気付きます。

何がこれを引き起こす可能性がありますか、またはこれが起こっていると考えるほど私を混乱させる可能性のある誤解は何ですか? 検索しましたが、コンストラクターへの明示的な呼び出しが表示されません。最小限のテストケースではこれを複製できませんでした。正確な答えを提供することは不可能であることは承知していますが、良い方向性を示すものは何でもありがたいです.

問題があれば、Ubuntu 12.04 で gcc 4.6.3 を使用しています。x64

4

1 に答える 1

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;
于 2012-10-06T21:05:44.830 に答える