我有一个非常奇怪的错误消息,只有当我将以下行添加到我的项目时才会出现:
std::list<CRect> myVar;
值得注意的是,它不一定是std :: list,它可以是std :: vector或我假设的任何其他STL容器。
以下是错误消息:
错误1错误LNK2005:“public: __thiscall std :: list
:: list&gt;(void)“ (φ0 $ @表@@ VCRect V'$ @分配器@@@ VCRect性病性病@@@ @@ QAE @ XZ) 已定义于 SomeLowLevelLibrary.lib
错误消息中引用的低级库不知道我正在构建的项目,它只具有核心低级功能,并且不处理高级MFC GUI。
如果我将代码行更改为:
,我可以将链接器错误消除std::list<CRect*> myVar;
但我不想为此而破解它。
此外,如果我在堆栈或堆上创建变量并不重要,我仍会得到相同的错误。
有没有人对此有任何想法? 我在Vista Enterprise上使用Microsoft Visual Studio 2008 SP1。
编辑:上面的链接器错误是针对std :: list&lt;&gt;构造函数,我也得到了析构函数,_Nextnode和清除函数的错误。
编辑:在项目的其他文件中,std :: vector不会链接,在其他文件中它可能是std :: list。我无法弄清楚为什么有些容器可以工作,有些则没有。 MFC链接在两个库中都是静态的。在低级库中,我们有一个继承自std :: list。
的类编辑:低级库没有任何从CRect继承的类,但它确实使用了STL。
答案 0 :(得分:2)
您应该查看链接器设置,但我无法立即说出哪些。 STL实例化在多个文件中完成是正常的。链接器应该选择一个。它们都是相同的(假设你做具有一致的编译器设置)。
答案 1 :(得分:1)
我最近在我们的项目中偶然发现了这个错误,并且决定进行更彻底的调查,而不是像上次修补它一样(用于CArray的swap std :: list)。事实证明,我们的一个低级库是从std :: list继承的,例如
class LIB_EXPORT CRectList : public std::list<CRect>
{
};
这不仅是不好的做法,而且也是主应用程序中链接器错误的原因。我改变CRectList来包装std :: list而不是继承它,错误就消失了。
答案 2 :(得分:0)
这听起来不像确切的症状,但是要确保您应该检查您的主项目和所有包含的库是否使用“C ++:代码生成”下的相同“运行时库”设置。混合这些设置可能会创建运行时库链接错误。 (在你的情况下让我感到困惑的是,你可以通过更改代码来消除它,但如果你还没有,那就值得检查。)
答案 3 :(得分:0)
SomeLowLevelLibrary.lib是否包含或使用任何名为CRect的类?它是否使用STL?
答案 4 :(得分:0)
文件中是否包含可能编译成两个独立代码模块的标题?
答案 5 :(得分:0)
今天又出现了另一种随机可能性。您当前的DLL和低级库是否可能引用两个不同版本的MFC?远射。