3

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

std::list<CRect> myVar;

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

这是错误消息:

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

::list >(void)" (??0?$list@VCRect@@V?$allocator@VCRect@@@std@@@std@@QAE@XZ) 已在 SomeLowLevelLibrary.lib 中定义

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

如果我将代码行更改为:

std::list<CRect*> myVar;

但我不想为了它而破解它。

此外,无论我是在堆栈还是堆上创建变量,我仍然会得到同样的错误。

有没有人对此有任何想法?我在 Vista Enterprise 上使用 Microsoft Visual Studio 2008 SP1。

编辑:上面的链接器错误是针对 std::list<> 构造函数的,我也收到析构函数、_Nextnode 和 clear 函数的错误。

编辑:在项目的其他文件中,std::vector 不会链接,在其他文件中它可能是 std::list。我无法弄清楚为什么有些容器可以工作,而有些则不能。MFC 链接在两个库中都是静态的。在低级库中,我们有 1 个继承自 std::list 的类。

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

4

6 回答 6

2

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

于 2008-09-30T14:18:48.773 回答
1

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

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

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

于 2009-10-23T10:32:41.353 回答
0

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

于 2008-09-29T14:26:16.097 回答
0

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

于 2008-09-29T20:12:32.943 回答
0

该文件是否包含在可能被编译成两个单独的代码模块的标头中?

于 2008-09-30T14:25:51.177 回答
0

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

于 2008-10-01T20:55:38.860 回答