【问题标题】:Link Errors in Unmodified Visual Studio 2012 MFC Template when Statically Linking MFC静态链接 MFC 时未修改的 Visual Studio 2012 MFC 模板中的链接错误
【发布时间】:2012-11-15 09:15:50
【问题描述】:

在 Visual Studio 2012 中创建最简单类型的新 MFC 应用程序并将其设置为静态链接到 MFC 时,链接失败。

这是一个gallery of 7 screenshots,从通过向导创建项目到构建(导致链接器错误)。 中间没有进行源代码编辑。

错误日志状态:

1>------ Build started: Project: Test, Configuration: Debug Win32 ------
1>  stdafx.cpp
1>  TestDlg.cpp
1>  Test.cpp
1>  Generating Code...
1>uafxcwd.lib(afxctrlcontainer2.obj) : error LNK2005: "void __cdecl AfxRegisterMFCCtrlClasses(void)" (?AfxRegisterMFCCtrlClasses@@YAXXZ) already defined in afxnmcdd.lib(afxctrlcontainer2.obj)
1>uafxcwd.lib(afxctrlcontainer2.obj) : error LNK2005: "protected: void __thiscall CMFCControlContainer::PreUnsubclassControl(class CWnd *)" (?PreUnsubclassControl@CMFCControlContainer@@IAEXPAVCWnd@@@Z) already defined in afxnmcdd.lib(afxctrlcontainer2.obj)
1>uafxcwd.lib(afxctrlcontainer2.obj) : error LNK2005: "public: int __thiscall CMFCControlContainer::SubclassDlgControls(void)" (?SubclassDlgControls@CMFCControlContainer@@QAEHXZ) already defined in afxnmcdd.lib(afxctrlcontainer2.obj)
1>C:\Users\XXXXXXXX\Documents\Visual Studio 2012\Projects\Test\Debug\Test.exe : fatal error LNK1169: one or more multiply defined symbols found
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

这只是我吗?您对如何解决这个问题有什么建议吗?

【问题讨论】:

  • 如果我不得不冒险猜测,我会说向导坏了。如果您要链接到静态 MFC 和 CRT,auto-magic setup from afx.h 应该会为您解决这个问题。假设您正在使用 Unicode 支持进行编译(无论如何,您似乎是;现在谁不支持?)对于 static-unicode-debug,正确的库似乎是 uafxcwd.lib。第二个库根本不应该存在,或者链接器顺序错误。我很想知道如果您在删除 PCH 文件后关闭 关闭 Unicode 支持并重新构建会发生什么。
  • 我认为您应该将此作为错误报告给 Microsoft。我认为您可以直接从 VS 2012 的“帮助”菜单中执行此操作。然后从链接器选​​项中删除所有看起来像 afxnmcdd.lib 的虚假库,然后添加回 uafxcwd.lib。也许添加/NODEFAULTLIBS
  • @warren-p 我同意。我肯定会这样做,以免其他人为追踪这个问题而头疼。希望(?)这是一个实际的错误,而不是特定于我的设置。
  • 请参阅blogs.msdn.com/b/vcblog/archive/2012/02/06/10263387.aspx 了解这些符号为何同时存在于uafxcw.libafxnmcd.lib 中的一些背景知识。由于库有重复的符号是有意的,我认为您可能需要使用/force:multiple 来使用这组选项进行构建。 /force:multiple 确实使项目能够构建和运行,但我对 MFC 真的不够熟悉,不知道这是否是正确的解决方法/修复,或者它是否只是隐藏了一个问题。

标签: c++ visual-c++ mfc visual-studio-2012 linker-errors


【解决方案1】:

经过测试,v100 运行良好,v110 不运行。尝试通过此链接向 MS Connect 报告:http://connect.microsoft.com/VisualStudio/feedback/details/581084/linker-cant-locate-some-external-symbol-when-use-mfc-in-a-static-library

【讨论】:

    【解决方案2】:

    当我尝试将我的项目静态链接在一起时遇到了同样的问题。

    正如 Michael Burr 所建议的,在 stdafx.h 中注释掉 #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS 行后似乎很好。

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题。如果您决定使用#define _AFX_NO_MFC_CONTROLS_IN_DIALOGS 并摆脱大量MFC 开销,您还应该确保将对话框基类、方法调用等从CDialogEx 更改为CDialog

      如果你不改变对话框的背景颜色或图像,你会发现CDialogEx无论如何都没什么用。

      【讨论】:

        猜你喜欢
        • 2010-12-13
        • 1970-01-01
        • 2012-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-08
        • 2019-06-27
        • 2011-04-04
        相关资源
        最近更新 更多