2009-11-24 70 views
9

我正在編譯一些依賴於包含防護的代碼來防止對象和函數的多重定義,但Visual Studio 2008給我的鏈接錯誤有多個定義。我不明白爲什麼,因爲我以前使用的代碼非常類似,並且沒有造成問題。我一定在做些愚蠢的事情,但我不知道它是什麼。我也嘗試去掉包含衛士並使用#pragma一次,但我得到相同的鏈接錯誤。我應該檢查什麼?爲什麼不包括曾經工作的警衛或雜注?

回答

17

如果它們是鏈接器錯誤,最可能的原因可能是標頭中定義的非內聯函數。

如果在包含在多個源文件中的頭中有一個非內聯函數,它將在每個源文件(「翻譯單元」)中定義,因此該函數將被定義爲多於一次,因此多重定義錯誤。

+0

是的,你是對的...哎呀。謝謝! – Stewart 2009-11-24 04:52:18

+0

你也可以通過製作模板來使它們變成弱符號 – 2009-12-09 10:39:33

0

如果你遇到鏈接器錯誤...你確定你不是1)在代碼中實際定義一個函數兩次或2)試圖做一些愚蠢的事情,如源文件(與頭文件相反)#include )?

0

這也可能是由於使用鏈接其他庫的不同版本的cstd庫引起的。請在C++/Code生成部分下檢查並確保所有項目都使用相同的設置。