2012-01-20 18 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文件?

難道這是一個pragma def或類似的地方在那些強制.lib輸出的類中?我使用VS2010,建設一個普通的舊的Win32 C++應用程序

+4

我不明白'map has split'是什麼意思 - 如果你在代碼中聲明瞭一張地圖,它就不能拆分。你能展示一些代碼來說明嗎? –

+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之前以aphabetically出現),並因此在地圖被覆蓋之前在地圖中註冊。

所以看起來共享庫的輸出與此完全沒有關係。

只需chaing起始線到

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

犯規修改地圖,並通過模板來正確編譯。

不知道如何,但希望這可以幫助別人。