由于这篇文章变得比它应该的大得多,我又重新开始了。
我的问题是,对于某些共鸣,我的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文件,只需添加一个由库提供给我的类的类成员?
这可能是一个pragma def或类似于那些强制.lib输出的类中某些东西?
我正在使用VS2010并构建一个普通的旧win32 c ++应用程序
答案 0 :(得分:0)
经过多次咆哮错误的树之后,我发现我的问题与共享库或范围无关。这个问题是由我放在CPP文件顶部的地图的静态初始化引起的,以避免外部未解决的
CBaseFactory::map_type* CBaseFactory::map = new map_type()
显然正在创建一个新的地图实例......
如果它是NULL
,CBaseFactory还试图在第一次使用时实例化地图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;
不修改地图并导致模板正确编译。
不确定如何,但希望这有助于某人。