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
- 路径:
- Debug模式:
- 重新编译项目
方案二:使用MFC静态链接库
- 移除手动添加的
libcmtd.lib(nafxcwd.lib为静态调试MFC库,VS会自动关联匹配的运行库) - 项目属性配置:
- Debug模式:
- 路径:
项目属性 → 配置属性 → C/C++ → 代码生成 → 运行库,选择/MTd - 路径:
项目属性 → 配置属性 → 常规 → MFC的使用,选择在静态库中使用MFC
- 路径:
- Release模式:
- 路径:
项目属性 → 配置属性 → C/C++ → 代码生成 → 运行库,选择/MT - 路径:
项目属性 → 配置属性 → 常规 → MFC的使用,选择在静态库中使用MFC
- 路径:
- Debug模式:
- 重新编译项目
额外处理:消除_WIN32_WINNT警告
在项目属性 → 配置属性 → C/C++ → 预处理器 → 预处理器定义中添加_WIN32_WINNT=0x0601(对应Windows 7及以上,可根据目标系统调整版本号),避免默认版本的警告。
内容的提问来源于stack exchange,提问作者user366312
相关产品推荐
相关产品推荐

