Visual studio 2008 奇怪的MFC/VC++;链接器错误(std::list<;CRect>;已定义)

Visual studio 2008 奇怪的MFC/VC++;链接器错误(std::list<;CRect>;已定义),visual-studio-2008,mfc,linker,Visual Studio 2008,Mfc,Linker,我收到了一条非常奇怪的错误消息,只有在我向项目中添加以下行时才会出现: std::list<CRect> myVar; std::list myVar; 值得注意的是,它不必是std::list,它可以是std::vector或我假设的任何其他STL容器 以下是错误消息: 错误1错误LNK2005:“公共: __thiscall std::list ::列表>(无效) (??0?$list@VCRect@@V$allocator@VCRect@@@std@@@std@@QAE@X

我收到了一条非常奇怪的错误消息,只有在我向项目中添加以下行时才会出现:

std::list<CRect> myVar;
std::list myVar;
值得注意的是,它不必是std::list,它可以是std::vector或我假设的任何其他STL容器

以下是错误消息:

错误1错误LNK2005:“公共: __thiscall std::list

::列表>(无效) (??0?$list@VCRect@@V$allocator@VCRect@@@std@@@std@@QAE@XZ) 已在中定义 SomeLowLevelLibrary.lib

错误消息中引用的低级库不知道我正在构建的项目,它只具有核心低级功能,不处理高级MFC GUI

如果我将代码行更改为:

std::list<CRect*> myVar;
std::list myVar;
但我不想为了它而破解它

另外,不管我是在堆栈还是堆上创建变量,我仍然会得到相同的错误

有人对此有什么想法吗? 我正在Vista Enterprise上使用Microsoft Visual Studio 2008 SP1

Edit:上面的链接器错误是针对std::list构造函数的,我还针对析构函数、\u Nextnode和clear函数得到了一个错误

编辑:在项目中的其他文件中,std::vector不会链接,在其他文件中,它可能是std::list。我不明白为什么有些容器能用,有些却不能用。MFC链接在两个库中都是静态的。在低级库中,我们有一个从std::list继承的类


编辑:低级库没有任何从CRect继承的类,但它确实使用STL。

这听起来不像是确切的症状,但要确保您应该检查主项目和所有包含的库是否使用“C++:代码生成”下相同的“运行时库”设置。混合这些设置可能会创建运行时库链接错误。(在您的例子中,让我困惑的是,您可以通过更改代码使其消失,但如果您尚未更改代码,则值得检查。)

SomeLowLevelLibrary.lib是否包含或使用名为CRect的类?它使用STL吗?

您应该查看链接器设置,但我不能马上说是哪个。STL实例化在多个文件中进行是正常的。链接器应该选择一个。它们都是相同的(假设你有一致的编译器设置)。

文件是否包含在一个可以编译成两个独立代码模块的头文件中?

今天我突然想到另一个随机的可能性。您当前的DLL和低级库是否可能引用了MFC的两个不同版本?远射

我最近在我们的项目中再次偶然发现了这个错误,并决定进行更彻底的调查,而不是像上次那样用黑客修补它(CArray的swap std::list)。事实证明,我们的一个低级库是从std::list继承的,例如

class LIB_EXPORT CRectList : public std::list<CRect>
{
};
类库导出正确列表:公共标准::列表 { };
这不仅是不好的做法,也是主应用程序中链接器错误的原因。我将CRectList改为包装std::list,而不是从中继承,错误消失了。

您是否有SomeLowLevelLibrary.lib的代码。如果是这样的话,浏览一下源代码列表,看看你得到了什么回报。你能提供关于你的项目和SomeLowLevelLibrary.lib的MFC库(静态、共享)链接的信息吗?是的,这不是运行时支持,因为我们在MFC中到处都使用它。