2013-05-21 24 views
0

我有一個VS10解決方案,其中包含2個具有相同名稱功能的項目。鏈接器抱怨(拋出警告)關於第二個定義(同名的兩個功能)越來越被忽略:Visual Studio解決方案與具有相同名稱的功能的不同項目

warning LNK4006: "void __cdecl function_name(short *,class Bbox *,int,int,struct FILE_NAMES *,unsigned char *)" ([email protected]@[email protected]@[email protected]@[email protected]) already defined in XXX.lib(segment.obj); second definition ignored 

這將導致第二個項目(被忽略的一個)的函數的調用指向的功能第一個項目(因爲定義被忽略)。

我的問題是:有沒有什麼辦法可以避免/解決這個問題,除了重命名所有在兩個項目中具有相同名稱的函數?例如,通過將#if/pragma添加到我的頭文件中,或者通過操作.obj文件。實際情況是,解決方案只需要編譯過程中的兩個項目中的一個,因此條件編譯的一個簡單方法非常好,但我的第一選擇是將兩個項目編譯在一起。

回答

1

這違反了One Definition Rule,只表示一個定義的tempate,類型,函數或對象可能存在於整個程序中。要解決這個問題,要麼通過名稱或參數重載使這兩個函數的簽名具有唯一性,要麼將它們放在不同的名稱空間中,要麼在使用兩個庫的同時使用條件編譯。

+0

謝謝!你有條件編譯的鏈接嗎? – SMir

+1

[This](http://en.cppreference.com/w/cpp/preprocessor/conditional)關於CPPReference的頁面應該讓你開始。 –

+0

翻譯單位是一個cpp文件,還是項目或整個解決方案?相同名稱的功能駐留在兩個不同的項目中。基於wiki頁面,TU是一個cpp文件,在這種情況下,不同項目中的相同名稱不應該成爲問題。我完全錯了嗎? – SMir

相關問題