2009-10-16 190 views
4

我有一個頭文件,可以說Common.h,它包含在幾個項目中的所有文件中。基本上我想,當我做這個,我得到噸鏈接錯誤的說法在全局頭文件中聲明一個全局變量?

類的MemoryManager * gMemoryManager已定義聲明一個全局變量,例如:

class MemoryManager; 
DLL_EXPORT MemoryManager* gMemoryManager; 

:(?

回答

10

因爲它是你在每個編譯文件創建變量的單獨副本。這些都是然後在連接階段發生碰撞。記住,預處理器中的所有頭文件讀取,使一個大文件了所有的人的。所以每個這個大文件編譯時間,創建的gMemoryManager另一個完全相同的副本。

您需要使用extern和一個非頭文件中定義它。

在你頭文件

extern DLL_EXPORT MemoryManager* gMemoryManager; 

在你的C++一個文件

DLL_EXPORT MemoryManager * gMemoryManager; 

通過我不知道DLL_EXPORT做什麼的樣子,我只是假設,它需要在這兩個地方去。

+0

從函數庫中導出函數時,這是MS特定的擴展,用於處理C++名稱加密。 – 2009-10-16 15:14:48

+0

它是否需要在頭文件和聲明?我不想提供一些錯誤的信息。謝謝。 – 2009-10-16 15:16:48

+0

根據我的經驗,宏'DLL_EXPORT'通常用於爲Microsoft編譯器定義'__declspec(dllexport)'。 的#if定義(WIN32) 的#define DLL_EXPORT __declspec(DLLEXPORT) 的#else 的#define DLL_EXPORT #ENDIF 如果沒有 '__declspec(dllexport)的' 編譯器不會使變量可見在DLL中。 它不在頭文件之外。 – gnash117 2013-03-28 16:32:06

2

MemoryManager* gMemoryManager; 

限定的變量。如果您在標題中執行此操作,則將在包含該標題的每個翻譯單元中定義該變量,因此會導致鏈接器錯誤。如果你想申報一個變量,這樣來做:

extern DLL_EXPORT MemoryManager* gMemoryManager; 

,並且將定義爲只有一個CPP文件。

0

當你想分享其中在C++中多個源文件中的全局變量,你只需要在一個頭文件(.h)中作爲

extern typeName variableName; 

也僅僅是相應的源文件(申報。 CPP)應包含定義

typeName variableName; 

的extern關鍵字是必需的,以區分定義的聲明。