当以/MT选项编译MFC项目时,会报下面的错误

1>nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned __int64)" (??2@YAPEAX_K@Z) 已经在 LIBCMTD.lib(new_scalar.obj) 中定义
1>nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPEAX@Z) 已经在 LIBCMTD.lib(delete_scalar.obj) 中定义
1>nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned __int64)" (??_U@YAPEAX_K@Z) 已经在 LIBCMTD.lib(new_array.obj) 中定义
1>nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete[](void *)" (??_V@YAXPEAX@Z) 已经在 LIBCMTD.lib(delete_array.obj) 中定义
1>J:\gfirfid\project.vs\bin\Debug\Ast2600FaceSample.exe : fatal error LNK1169: 找到一个或多个多重定义的符号

关于为什么会报这个错误,还是要看microsoft官方的说明:
A LNK2005 error occurs when the CRT library and MFC libraries are linked in the wrong order in Visual C++

英文一大堆,其实简要说来就是,CRT库和MFC库都定义了new,delete和 DllMain 函数,这些函数要求先链接 MFC 库,然后再链接 CRT 库。
因为连接顺序不正确造成编译错误。

解决办法–修改连接顺序

如果你是手工创建的MSVC工程,解决办法很简单,网上类似的文章很多,方法都一样,就是修改uafxcwd.lib,libmcmtd.lib的连接顺序,确保uafxcwd.lib在libmcmtd.lib前面。
参见:https://www.cnblogs.com/qingtian224/p/5833456.html

解决办法–/FORCE选项

还有个比较懒的办法,就是用在连接命令中加上/FORCE选项,忽略这个错误

这样以来上面的连接错误就成警告:

1>LINK : warning LNK4075: 忽略“/INCREMENTAL”(由于“/FORCE”规范)
1>nafxcwd.lib(afxmem.obj) : warning LNK4006: "void * __cdecl operator new(unsigned __int64)" (??2@YAPEAX_K@Z) 已在 LIBCMTD.lib(new_scalar.obj) 中定义;已忽略第二个定义
1>nafxcwd.lib(afxmem.obj) : warning LNK4006: "void __cdecl operator delete(void *)" (??3@YAXPEAX@Z) 已在 LIBCMTD.lib(delete_scalar.obj) 中定义;已忽略第二个定义
1>nafxcwd.lib(afxmem.obj) : warning LNK4006: "void * __cdecl operator new[](unsigned __int64)" (??_U@YAPEAX_K@Z) 已在 LIBCMTD.lib(new_array.obj) 中定义;已忽略第二个定义
1>nafxcwd.lib(afxmem.obj) : warning LNK4006: "void __cdecl operator delete[](void *)" (??_V@YAXPEAX@Z) 已在 LIBCMTD.lib(delete_array.obj) 中定义;已忽略第二个定义
1>J:\gfirfid\project.vs\bin\Debug\Ast2600FaceSample.exe : warning LNK4088: 因 /FORCE 选项生成了映像;映像可能不能运行

个人认为这个办法是不可取的,属于掩盖问题,掩耳盗铃。

解决办法–cmake脚本

如果你的项目是cmake脚本创建的,手工修改MSVC的工程配置就不可取了。要从修改cmake脚本下手才能根本解决,不留后患。

 # WITH_STATIC_CRT在这里指定是否开启/MT (静态库连接)选项# 根据 WITH_STATIC_CRT 决定是否在_target中定义_AFXDLL宏# 这里$<...>用到了生CMAKE成器表达式(cmake-generator-expressions),参见CMAKE官方文档target_compile_definitions(${_target} PRIVATE $<$<NOT:$<BOOL:${WITH_STATIC_CRT}>>:_AFXDLL> )if(WITH_STATIC_CRT)# 定义nafxcw 和libcmt的连接顺序,库名根据$<CONFIG:Debug>表达式决定是否有d后缀# Debug版本为 nafxcwd,libcmtd,Release版本为nafxcw,libcmttarget_link_libraries(${_target} nafxcw$<$<CONFIG:Debug>:d> libcmt$<$<CONFIG:Debug>:d>)endif()

cmake:解决error LNK2005: void * __cdecl operator new(unsigned __int64) already defined in LIBCMTD.lib相关推荐

  1. error LNK2005: void * __cdecl operator new(unsigned int) (??2@YAPAXI@Z) already defined in LIBCMT.

    环境:在非MFC程序(使用standard windows library)中,添加MFC支持,静态链接MFC库. 发生以下错误: uafxcw.lib(afxmem.obj) : error LNK ...

  2. 成功解决error: no match for ‘operator<<’ (operand types are ‘std::basic_ostream<char>’ and ‘Eigen::Quate

    error: no match for 'operator<<' (operand types are 'std::basic_ostream' and 'Eigen::Quaternio ...

  3. error LNK2005解决方法

    错误: 1>nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)&quo ...

  4. error LNK2005: _DllMain@12 already defined in MSVC

    error LNK2005: _DllMain@12 already defined in MSVC 方案一. 编程中经常能遇到LNK2005错误--重复定义错误,其实LNK2005错误并不是一个很难 ...

  5. 关于error LNK2005: char * xxx (?xx@@3PADA) already defined in xxx

    今天,看到群上的群友问一个关于LINK2005的BUG,报:已经定义过的错误 其实这个问题难倒了很大一部分程序员,这个错误的原因是他想定义一个全局变量,于是他就在.h文件中直接定义并给这个变量赋值,这 ...

  6. error LNK2005:

    error LNK2005: _DllMain@12 already defined in MSVC 编程中经常能遇到LNK2005错误--重复定义错误,其实LNK2005错误并不是一个很难解决的错误 ...

  7. error LNK2005: _DllMain@12 already defined in MSVC 2009-10-29 17:49

    error LNK2005: _DllMain@12 already defined in MSVC 方案一. 编程中经常能遇到LNK2005错误--重复定义错误,其实LNK2005错误并不是一个很难 ...

  8. error LNK2005: int dir (?dir@@3HA) already defined in GameStart.obj

    方案一. 编程中经常能遇到LNK2005错误--重复定义错误,其实LNK2005错误并不是一个很难解决的错误.弄清楚它形成的原因,就可以轻松 解决它了.         造成LNK2005错误主要有以 ...

  9. error LNK2005: _DllMain@12 already defined in xxx 的应对

    error LNK2005: _DllMain@12 already defined in MSVC 方案一. 编程中经常能遇到LNK2005错误--重复定义错误,其实LNK2005错误并不是一个很难 ...

最新文章

  1. python list越界原因(list assignment index out of range)
  2. 《深入浅出Ext JS》改版意见有奖征集活动!
  3. Ie html button消失,input 按钮在IE下显现不一致的兼容问题
  4. js+php在线截图 jquery fileupload.js,另一种图片上传 jquery.fileupload.js
  5. Python——格式转换的学习笔记
  6. 关于理解《C++ 对象模型》中:把单一元素的数组放在末尾,struct可以拥有可变大小的数组...
  7. 2015职称计算机考试模拟,2015职称计算机考试《Dreamweaver》模拟试题(9)
  8. Leetcode之回文数
  9. ibm x5服务器系统重装,IBM 3850 X5 Server安装Windows 2003步骤说明
  10. Pandas 安装到Pycharm
  11. 开源漫画服务器Mango
  12. 爬虫抓图全网最新方法,这一次终于是4k高清美图,只因为我不下载JPG图片!
  13. 大学应届毕业生面临的压力和应对办法
  14. wps如何设置表格中文字的行间距
  15. Linux无线AP隔离功能分析
  16. JavaScript小项目总结
  17. 自定義ListActivity(一)
  18. Black-Scholes-Merton 方程解(基于风险中性定价)
  19. 去除字符串中所有的空格
  20. CCCC 天梯赛-5-10 排座位

热门文章

  1. 计算机专业本科毕业生去直招士官,北京市2018年直招士官信息来了!
  2. POI HSSFWorkbook导出Excel到本地电脑
  3. 一路向北,扬鞭策马九龙山
  4. 自己早期写的一个简单上下班打卡统计工时的考勤系统【整理版】
  5. 计算机相关知识 摩尔,计算机基础知识试题及答案解析
  6. rk3568mipi摄像头调试(gc2385 + gc2053)
  7. 通过串口去修改ODA管理口的IP
  8. kafka 安装及测试
  9. 利用VBA在excel中批量添加备注
  10. 极智嘉Geek+全柔性智能分拣系统首次落地英国,赋能ASDA拥有更强物流能力