cmake:解决error LNK2005: void * __cdecl operator new(unsigned __int64) already defined in LIBCMTD.lib
当以/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相关推荐
- 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 ...
- 成功解决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 ...
- error LNK2005解决方法
错误: 1>nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)&quo ...
- error LNK2005: _DllMain@12 already defined in MSVC
error LNK2005: _DllMain@12 already defined in MSVC 方案一. 编程中经常能遇到LNK2005错误--重复定义错误,其实LNK2005错误并不是一个很难 ...
- 关于error LNK2005: char * xxx (?xx@@3PADA) already defined in xxx
今天,看到群上的群友问一个关于LINK2005的BUG,报:已经定义过的错误 其实这个问题难倒了很大一部分程序员,这个错误的原因是他想定义一个全局变量,于是他就在.h文件中直接定义并给这个变量赋值,这 ...
- error LNK2005:
error LNK2005: _DllMain@12 already defined in MSVC 编程中经常能遇到LNK2005错误--重复定义错误,其实LNK2005错误并不是一个很难解决的错误 ...
- error LNK2005: _DllMain@12 already defined in MSVC 2009-10-29 17:49
error LNK2005: _DllMain@12 already defined in MSVC 方案一. 编程中经常能遇到LNK2005错误--重复定义错误,其实LNK2005错误并不是一个很难 ...
- error LNK2005: int dir (?dir@@3HA) already defined in GameStart.obj
方案一. 编程中经常能遇到LNK2005错误--重复定义错误,其实LNK2005错误并不是一个很难解决的错误.弄清楚它形成的原因,就可以轻松 解决它了. 造成LNK2005错误主要有以 ...
- error LNK2005: _DllMain@12 already defined in xxx 的应对
error LNK2005: _DllMain@12 already defined in MSVC 方案一. 编程中经常能遇到LNK2005错误--重复定义错误,其实LNK2005错误并不是一个很难 ...
最新文章
- python list越界原因(list assignment index out of range)
- 《深入浅出Ext JS》改版意见有奖征集活动!
- Ie html button消失,input 按钮在IE下显现不一致的兼容问题
- js+php在线截图 jquery fileupload.js,另一种图片上传 jquery.fileupload.js
- Python——格式转换的学习笔记
- 关于理解《C++ 对象模型》中:把单一元素的数组放在末尾,struct可以拥有可变大小的数组...
- 2015职称计算机考试模拟,2015职称计算机考试《Dreamweaver》模拟试题(9)
- Leetcode之回文数
- ibm x5服务器系统重装,IBM 3850 X5 Server安装Windows 2003步骤说明
- Pandas 安装到Pycharm
- 开源漫画服务器Mango
- 爬虫抓图全网最新方法,这一次终于是4k高清美图,只因为我不下载JPG图片!
- 大学应届毕业生面临的压力和应对办法
- wps如何设置表格中文字的行间距
- Linux无线AP隔离功能分析
- JavaScript小项目总结
- 自定義ListActivity(一)
- Black-Scholes-Merton 方程解(基于风险中性定价)
- 去除字符串中所有的空格
- CCCC 天梯赛-5-10 排座位