Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 应用程序有2个静态变量作用域_C++_Static_Scope_Singleton - Fatal编程技术网

C++ 应用程序有2个静态变量作用域

C++ 应用程序有2个静态变量作用域,c++,static,scope,singleton,C++,Static,Scope,Singleton,当这篇文章变得比它应该的更大时,我又重新开始了 我的问题是,对于一些Reon,我的C++项目的一部分被自动编译成一个共享库,因此不再与我的代码库共享静态范围。 我已经找出了原因,但仍然不明白为什么会发生这种情况 我正在将一个第三方共享库集成到我的项目中,这要求我也向我的项目中添加一些类 如果我只链接到库并包含头文件,我的项目会输出一个exe文件,一切都很顺利 我补充的第二点: (CakFilePackageLowleveloBlocking是我需要通过cpp代码添加到项目中的类之一) 对于我的S

当这篇文章变得比它应该的更大时,我又重新开始了

我的问题是,对于一些Reon,我的C++项目的一部分被自动编译成一个共享库,因此不再与我的代码库共享静态范围。 我已经找出了原因,但仍然不明白为什么会发生这种情况

我正在将一个第三方共享库集成到我的项目中,这要求我也向我的项目中添加一些类

如果我只链接到库并包含头文件,我的项目会输出一个exe文件,一切都很顺利

我补充的第二点:

(CakFilePackageLowleveloBlocking是我需要通过cpp代码添加到项目中的类之一)

对于我的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++应用程序

,在大量错误的树上,我发现我的问题与共享库或范围无关。这个问题是由映射的静态初始化引起的,我将映射放在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;
不会修改映射并导致正确编译模板


不知道怎么做,但希望这对某人有所帮助。

我不明白你所说的
映射已拆分是什么意思
-如果你在代码中声明一个映射,它将无法拆分。你能展示一些代码来说明吗?我似乎记得全局变量和单例是在每个共享库中定义的,所以是的,如果类在库中注册,它们将在一个单独的单例中。(没有回答,因为我不确定)@stefaanv-我肯定这就是答案我90%肯定这就是原因,我需要帮助的是为什么会发生这种情况
CBaseFactory::map_type* CBaseFactory::map = CBaseFactory::map;