2008-09-29 29 views
3

我有,只有當我添加下面一行到我的項目發生了非常奇怪的錯誤消息:奇怪的MFC/VC++鏈接錯誤(已定義的std ::列表<CRect>)

std::list<CRect> myVar; 

值得注意它不必是一個std :: list,它可以是std :: vector或我假設的任何其他STL容器。

以下是錯誤消息:

錯誤1錯誤LNK2005: 「公共: __thiscall的std ::列表

::列表>(無效)」 (δλ0? $ @表@@ VCRect V'$ @分配器@@@ VCRect性病性病@@@ @@ QAE @ XZ) 在 已經定義SomeLowLevelLibrary.lib

錯誤消息中引用的低級別庫對我正在構建的項目不瞭解,它只具有核心低級功能,並且不處理高級別的MFC GUI。

我可以得到鏈接錯誤來,如果我改變的代碼行消失:

std::list<CRect*> myVar; 

但我並不想破解它的緣故吧。

此外,如果我在堆棧或堆上創建變量,我仍然會得到相同的錯誤。

有沒有人有這方面的任何想法? 我在Vista Enterprise上使用Microsoft Visual Studio 2008 SP1。

編輯:上面的鏈接器錯誤是在std ::列表<>的構造,我也得到一個錯誤的析構函數,_Nextnode和清除功能。

編輯:在項目中的其他文件中,std :: vector不會鏈接,在其他文件中它可能是std :: list。我無法弄清楚爲什麼有些容器可以工作,有些則不能。 MFC鏈接在兩個庫中都是靜態的。在低級庫中,我們有一個從std :: list繼承的類。

編輯:底層庫沒有任何繼承自CRect的類,但它確實利用了STL。

+0

您是否擁有SomeLowLevelLibrary.lib的代碼。如果如此,請瀏覽列表的源代碼並查看您獲得的回報。 – 2008-09-29 10:32:39

+0

您能否提供有關您的項目和SomeLowLevelLibrary.lib的MFC庫(靜態,共享)鏈接的信息。 – 2008-09-29 10:45:59

回答

1

我最近在我們的項目中再次偶然發現了這個錯誤,並決定進行更徹底的調查,而不是像上次那樣使用黑客補丁(對於CArray交換std :: list)。事實證明,我們的一個低級庫從std :: list繼承,例如

class LIB_EXPORT CRectList : public std::list<CRect> 
{ 
}; 

這不僅是不好的做法,而且也是主應用程序中鏈接器錯誤的原因。我改變CRectList來包裝std :: list而不是從它繼承,錯誤消失了。

0

這聽起來不像確切的症狀,但要確保您應該檢查您的主項目和所有包含的庫在「C++:代碼生成」下使用相同的「運行時庫」設置。混合這些設置可能會導致運行時庫鏈接錯誤。 (你的情況讓我感到困惑的是,你可以通過更改代碼來讓它消失,但值得檢查,如果你還沒有。)

0

SomeLowLevelLibrary.lib是否包含或使用任何名爲CRect的類?它使用STL嗎?

2

你應該看鏈接器設置,但我不能立即說哪個。 STL實例化在多個文件中完成是正常的。鏈接器應該選擇一個。它們都是相同的(假設你有一致的編譯器設置)。

0

該文件是否包含在可能被編譯爲兩個獨立代碼模塊的頭文件中?

0

今天突然出現在我腦海中的另一種隨機可能性。有可能您當前的DLL和低級別庫引用了兩個不同版本的MFC?遠射。