Приложение имеет 2 области статических переменных - PullRequest
0 голосов
/ 20 января 2012

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

Моя проблема в том, что для некоторого резонанса часть моего проекта на 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, просто добавив члена класса типа, данного мне библиотекой?

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

Я использую VS2010 и создаю простое старое приложение win32 c ++

1 Ответ

0 голосов
/ 21 января 2012

После большого количества лая неправильного дерева я обнаружил, что моя проблема не имеет ничего общего с общей библиотекой или областью действия.Проблема была вызвана статической инициализацией карты, которую я поместил в верхнюю часть файла 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 в алфавитном порядке) и, следовательно, был зарегистрирован на карте до того, как карта была переопределена.общая библиотека выходной гаЭто абсолютно не имеет отношения к этому.

Просто введите строку инициализации в

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

Не изменяет карту и вызывает корректную компиляцию шаблона.

Не уверенкак, но, надеюсь, это кому-нибудь поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...