Я уверен, что сделал что-то не так, чтобы это произошло. Я использую библиотеку, которая объявляет карту статически, что, кажется, имеет смысл.
В заголовке в классе с именем 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
Это была проблема с видимостью / версией символа. Существует множество способов исправить это. Так как это существует только с этим компилятором в этой ОС, я решил немного изменить заголовочный файл и сохранить изменения самостоятельно. Я сообщу создателям библиотеки на случай, если они захотят включить это изменение.
Более подробную информацию о видимости символов можно найти по адресу: 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;
Других решений пока нет …