Конструктор вызывается дважды на статическом std :: map

Я уверен, что сделал что-то не так, чтобы это произошло. Я использую библиотеку, которая объявляет карту статически, что, кажется, имеет смысл.

В заголовке в классе с именем 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 библиотеки, затем я замечаю, что конструктор вызывается во второй раз аналогично первому.

Что могло вызвать это, или что, и я и недоразумение, которые могли бы смущать меня достаточно, чтобы думать, что это происходит? Я искал и не вижу явных обращений к конструктору. Я не мог продублировать это в минимальном тестовом случае. Я знаю, что дать точный ответ невозможно, но все, что укажет мне хорошее направление, будет оценено.

Если это имеет значение, я использую gcc 4.6.3 в Ubuntu 12.04. x64

2

Решение

Это была проблема с видимостью / версией символа. Существует множество способов исправить это. Так как это существует только с этим компилятором в этой ОС, я решил немного изменить заголовочный файл и сохранить изменения самостоятельно. Я сообщу создателям библиотеки на случай, если они захотят включить это изменение.

Более подробную информацию о видимости символов можно найти по адресу: 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;
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]