You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VS2017手动创建MFC应用编译报错:重复定义符号问题解决

解决VS2017手动创建MFC空项目的链接重复定义错误

问题背景

手动创建空C++项目编写MFC代码:

#include <afxwin.h>

class CMyApp : public CWinApp
{
public:
    virtual BOOL InitInstance()
    {
        CFrameWnd* pFrame = new CFrameWnd;
        if (!pFrame)
            return FALSE;

        pFrame->Create(NULL, _T("Minimal MFC Application"));
        m_pMainWnd = pFrame;
        pFrame->ShowWindow(SW_SHOW);
        pFrame->UpdateWindow();

        return TRUE;
    }
};

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    CMyApp app;
    AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
    return app.Run();
}

配置运行库(Debug用/MDd,Release用/MD)并手动添加nafxcwd.lib和libcmtd.lib后,出现链接错误:

1>------ Rebuild All started: Project: Project2, Configuration: Debug Win32 ------
1>Source.cpp
1>_WIN32_WINNT not defined. Defaulting to _WIN32_WINNT_MAXVER (see WinSDKVer.h)
1>nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in libcmtd.lib(delete_scalar.obj)
1>C:\Users\pc\source\repos\Project2\Debug\Project2.exe : fatal error LNK1169: one or more multiply defined symbols found
1>Done building project "Project2.vcxproj" -- FAILED.
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========

错误原因

operator delete重复定义是因为运行库配置与手动添加的链接库不匹配:

  • Debug模式选择了/MDd(多线程调试DLL运行库),但手动添加了libcmtd.lib(多线程调试静态运行库)
  • nafxcwd.lib是静态调试MFC库,与/MDd的DLL运行库内存管理机制冲突,导致符号重复

解决方法

方案一:使用MFC动态链接库(推荐)

  • 移除手动添加的nafxcwd.lib和libcmtd.lib
  • 项目属性配置:
    • Debug模式:
      • 路径:项目属性 → 配置属性 → C/C++ → 代码生成 → 运行库,选择/MDd
      • 路径:项目属性 → 配置属性 → 常规 → MFC的使用,选择在共享DLL中使用MFC
    • Release模式:
      • 路径:项目属性 → 配置属性 → C/C++ → 代码生成 → 运行库,选择/MD
      • 路径:项目属性 → 配置属性 → 常规 → MFC的使用,选择在共享DLL中使用MFC
  • 重新编译项目

方案二:使用MFC静态链接库

  • 移除手动添加的libcmtd.lib(nafxcwd.lib为静态调试MFC库,VS会自动关联匹配的运行库)
  • 项目属性配置:
    • Debug模式:
      • 路径:项目属性 → 配置属性 → C/C++ → 代码生成 → 运行库,选择/MTd
      • 路径:项目属性 → 配置属性 → 常规 → MFC的使用,选择在静态库中使用MFC
    • Release模式:
      • 路径:项目属性 → 配置属性 → C/C++ → 代码生成 → 运行库,选择/MT
      • 路径:项目属性 → 配置属性 → 常规 → MFC的使用,选择在静态库中使用MFC
  • 重新编译项目

额外处理:消除_WIN32_WINNT警告

在项目属性 → 配置属性 → C/C++ → 预处理器 → 预处理器定义中添加_WIN32_WINNT=0x0601(对应Windows 7及以上,可根据目标系统调整版本号),避免默认版本的警告。

内容的提问来源于stack exchange,提问作者user366312

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 15:58:12