我有一个非常奇怪的错误消息,只有当我将以下行添加到我的项目时才会出现:

std::list<CRect> myVar;

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

以下是错误消息:

  

错误1错误LNK2005:“public:   __thiscall std :: list

     
    

:: list&gt;(void)&quot;     (φ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。

有帮助吗?

解决方案 2

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

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

这不仅是不好的做法,而且也是主应用程序中链接器错误的原因。我改变CRectList来包装std :: list而不是继承它,错误就消失了。

其他提示

您应该查看链接器设置,但我无法立即说出哪些。 STL实例化在多个文件中完成是正常的。链接器应该选择一个。它们都是相同的(假设你具有一致的编译器设置)。

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

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

文件中是否包含可能编译成两个独立代码模块的标题?

今天又出现了另一种随机可能性。您当前的DLL和低级库是否可能引用两个不同版本的MFC?远射。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top