【问题标题】:Strange MFC / VC++ Linker Error (std::list<CRect> already defined)奇怪的 MFC / VC++ 链接器错误(std::list<CRect> 已定义)
【发布时间】:2008-09-29 10:18:09
【问题描述】:

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

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。

【问题讨论】:

  • 你有 SomeLowLevelLibrary.lib 的代码吗?如果是这样,请浏览 list 的源代码并查看您得到的回报。
  • 您能否提供有关与您的项目和 SomeLowLevelLibrary.lib 的 MFC 库(静态、共享)的链接的信息。

标签: visual-studio-2008 mfc linker


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 是的,这不是运行时支持,因为我们在 MFC 中到处使用它。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-04-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-12-30
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多