2015-09-27 143 views
-3

我有幾個.h/.cpp文件,每個文件都應該有一個名爲「common.h/common.cpp」的文件,因爲我在其餘部分重新使用它的定義我的文件。 common.h文件定義了一些有意的全局變量。gcc/g ++和全局變量的多重定義

我在Linux和gcc 4.4.7下工作。

Compuler做的工作不錯,但G ++鏈接器抱怨許多情況下,像:

build/Debug/GNU-Linux-x86/StoreData2/spacewx.o:(.data+0x200): multiple definition of `nmdata::names` 
build/Debug/GNU-Linux-x86/StoreData2/StoreData2.o:(.data+0x200): first defined here 

,因此,我沒有得到一個全成構建。請建議如何擺脫這個錯誤,並保持這些全局變量。我只使用函數式編程(使用C++庫,如boost),並且目前還沒有自己的命名空間/對象。

+3

你最小的例子是哪裏? –

+0

你真的不認爲任何來源可能是相關的嗎? –

+0

考慮使用'extern'關鍵字。如果你能給我們一些簡單的代碼,我可以給你一個很好的答案。 –

回答

3

比方說,您的全球首部(global.h):

#ifndef _GLOBAL_H 
#define _GLOBAL_H 

int g_a; 

#endif 

如果你有兩個源文件,包括global.ha.cppb.cpp這樣的:

a.cpp

#include "global.h" 
/* some source */ 

b.cpp

#include "global.h" 
/* some source */ 

預處理,他們看上去就像在此之後(包括文件展開):

a.cpp

int g_a; 
/* some source */ 

b.cpp

int g_a; 
/* some source */ 

所以,如果你編譯的源文件,全局變量int g_a將在兩個目標文件中定義。所以鏈接器會抱怨多個定義。

要解決此問題,您需要在標題中使用extern關鍵字。 extern關鍵字告訴編譯器該變量是在其他地方定義的。所以,不會有新的全局對象條目被寫入到目標文件中。

更改global.h如下:

#ifndef _GLOBAL_H 
#define _GLOBAL_H 

extern int g_a; 

#endif 

所以,不會有int g_a條目將被寫入到目標文件。但是這會導致鏈接中未定義的符號錯誤。爲了克服在a.cppb.cpp中定義int g_a但在兩者中都沒有的定義。

b.cpp

#include "global.h" 
int g_a; 
/* some source */ 
1

在程序的每個變量或函數只能定義一次,在一個編圖單元。如果定義了多於一個編譯單元中的任何內容,那麼通常會出現鏈接錯誤(雖然正式名稱爲「未定義行爲」),因此編譯器可能不會提供診斷信息,並且程序只會行爲不端。

你可以有多個聲明的程序中的事情,所以一般你設置的東西,讓你的頭文件有ONLY聲明,與在.cpp文件的所有定義。