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

3

我遇到了一个非常奇怪的错误信息,只有当我添加以下代码到我的项目中时才会出现:

std::list<CRect> myVar;

值得注意的是,它不一定是std::list,可以是std::vector或任何其他STL容器。
以下是错误消息:
错误1 错误LNK2005:“public: __thiscall std::list

::list >(void)”(??0?$list@VCRect@@V?$allocator@VCRect@@@std@@@std@@QAE@XZ)
已在SomeLowLevelLibrary.lib中定义
引用错误消息中的低级库不知道我正在构建的项目,它只有核心低级功能,不涉及高级MFC GUI。
如果我将代码行更改为:
std::list<CRect*> myVar;

但我不想仅仅为了破解而去破解。

此外,变量是在栈上还是堆上创建都无关紧要,我仍然会得到相同的错误。

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

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

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

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


你有 SomeLowLevelLibrary.lib 的代码吗?如果有,请浏览源代码以查看 list<CRect> 返回了什么。 - Jorge Ferreira
你能提供关于你的项目和SomeLowLevelLibrary.lib链接到MFC库(静态、共享)的信息吗? - Jorge Ferreira
6个回答

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

1

最近在我们的项目中,我再次遇到了这个错误,并决定进行更彻底的调查,而不是像上次那样用一个hack(比如将std::list替换为CArray)来修补它。结果发现,我们的一个低级库继承自std::list。

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

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


0
这似乎不是确切的症状,但为了确保,您应该检查您的主项目和所有包含的库在“C++:Code Generation”下使用相同的“Runtime Library”设置。混合这些设置可能会创建运行时库链接错误。(在您的情况下让我困惑的是,您可以通过更改代码来解决它,但如果您还没有检查过,那么这值得一试。)

是的,这不是运行时支持的问题,因为我们在MFC中随处使用它。 - Mark Ingram

0

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


0

这个文件是否包含在一个头文件中,可能被编译成两个不同的代码模块中?


0
今天我脑海中又冒出了一个随机的可能性。你当前的DLL和低级库是否引用了两个不同版本的MFC?这很小概率。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接