2012-01-20 2 views
0

Поскольку этот пост стал намного больше, чем следовало бы, я начал снова.Приложение имеет 2 статических переменных области

Моя проблема в том, что для некоторого резонанса часть моего проекта на C++ автоматически компилируется в общую библиотеку и поэтому больше не разделяет статическую область с остальной частью моей кодовой базы.

Я выделил причину этого, но до сих пор не понимаю, почему это произойдет.

Я интегрирую в общий проект стороннюю библиотеку, которая требует от меня добавления некоторых классов в мой проект.

Если я только ссылаюсь на библиотеку и включаю заголовки, мой проект выводит exe-файл, и все персиковое.

Второе, что я добавляю:

(CAkFilePackageLowLevelIOBlocking это один из классов, я должен был добавить через CPP код для моего проекта)

protected: 
    CAkFilePackageLowLevelIOBlocking m_LowLevelIO; 

в моем классе Soundmanager, а затем построить, я получаю эта дополнительная линия в конце говорит мне, его вывод .lib и .exp файл:

1> Generating Code... 
1>  Creating library D:\DustCloud\WorkingCopy\src\VS2010\Debug\GameDbg.lib and object D:\DustCloud\WorkingCopy\src\VS2010\Debug\GameDbg.exp 
1> VS2010.vcxproj -> D:\DustCloud\WorkingCopy\src\VS2010\Debug\GameDbg.exe 

Таким образом, чтобы получить возможность отправлять гораздо более простой вопрос,

Что может быть причиной моего проекта для создания .lib-файла просто путем добавления члена класса типа, предоставленного мне библиотекой?

Может ли это быть прагма-def или что-то подобное где-то в тех классах, которые вызывают выход .lib?

Я использую VS2010 и строить обычное старый win32 приложение C++

+4

Я не понимаю, что вы подразумеваете под словом «карта имеет раскол» - если вы объявляете одну карту в своем коде, она не может разделиться. Можете ли вы показать код для иллюстрации? –

+1

Кажется, я помню, что глобальные и, следовательно, синглтоны определены для каждой общей библиотеки, поэтому да, если классы зарегистрированы в библиотеке, они будут находиться в отдельном синглете. (нет ответа, потому что я не уверен) – stefaanv

+0

@stefaanv - Я уверен, что это точно ответ – vines

ответ

0

После многих ложного дерева, я обнаружил, что моя проблема не имеет ничего общего с общей библиотекой или объемом. Проблема была вызвана статической инициализации карты, которую я поставил в верхней части файла CPP, чтобы избежать нерешенной внешнего

CBaseFactory::map_type* CBaseFactory::map = new map_type() 

Было очевидно, создает новый экземпляр карты ...

CBaseFactory также пытался создать экземпляр карты при первом использовании если это NULL

static map_type * getMap() { 
    if(!map) 
    { 
     map = new map_type; 
    } 
    return map; 
} 

Очевидная проблема здесь, если код инициализации в верхней части файла фабрика CPP не получает казнен первым, то, что было добавлено до этой воли очиститься.

Причина, по которой это не представила себя, является полным совпадением соглашений об именах, что эта фабрика была определена в ComponentBase.h, которая была в первом случае, когда первый файл кода выполнял статическую инициализацию, поэтому ничего не очистилось.

После того, как я добавил ComponentAudio, ComponentAudioCharacter (оба они совпадают перед компонентом ComponentBase) и поэтому были зарегистрированы на карте до того, как карта была переопределена.

Таким образом, кажется, что доступ к общей библиотеке не имеет к этому никакого отношения.

Просто Chaing инициализации строку

CBaseFactory::map_type* CBaseFactory::map = CBaseFactory::map; 

Doesnt изменять карту и приводит к тому, шаблон будет составлен правильно.

Не знаете, как, но, надеюсь, это помогает кому-то.

Смежные вопросы