运行时库链接错误的修复方法
现象1:
1>正在链接...
1>nafxcwd.lib(dllmodul.obj) : error LNK2005: _DllMain@12 已经在 LIBCMTD.lib(dllmain.obj) 中定义
1>nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) 已经在 LIBCMTD.lib(new.obj) 中定义
1>nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) 已经在 LIBCMTD.lib(dbgdel.obj) 中定义
1>nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) 已经在 libcpmtd.lib(newaop.obj) 中定义
1>nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete[](void *)" (??_V@YAXPAX@Z) 已经在 LIBCMTD.lib(delete2.obj) 中定义
原因:运行时库冲突
冲突可能是:1.第三方lib库冲突
2.第三方的C语言代码冲突
解决方案1: 修改“配置属性\常规\MFC使用”和“配置属性\CC++\代码生成\运行库”
解决方案2:如果方案1的所有搭配都不能解决问题,请选择方案1中报错项目最少的方案,再通过修改链接顺序的方法修改,如图
(在“忽略特定库”和“附加依赖项”中同时添加“ libcpmtd”,有时也可只在“忽略特定库”中添加“ libcpmtd”)
解决方案3:
可以 使用链接器的 /VERBOSE:LIB 开关来确定链接器搜索的库。如果收到 LNK4098,并想创建使用如单线程、非调试运行时库的可执行文件,请使用 /VERBOSE:LIB 选项确定链接器搜索的库。链接器作为搜索的库输出的应是 LIBC.lib,而非 LIBCMT.lib、MSVCRT.lib、LIBCD.lib、LIBCMTD.lib 和 MSVCRTD.lib。对每个要忽略的库可以使用 /NODEFAULTLIB,以通知链接器忽略错误的运行时库。
下表显示根据要使用的运行时库应忽略的库。
若要使用第一行运行时库 请忽略第2行的这些库
单线程 (libc.lib)
libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
多线程 (libcmt.lib)
libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
使用 DLL 的多线程 (msvcrt.lib)
libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
调试单线程 (libcd.lib)
libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib
调试多线程 (libcmtd.lib)
libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib
使用 DLL 的调试多线程 (msvcrtd.lib)
libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib
例如,如果收到此警告,并希望创建使用非调试、单线程版本的运行时库的可执行文件,可以将下列选项与链接器一起使用:
/NODEFAULTLIB:libcmt.lib /NODEFAULTLIB:msvcrt.lib /NODEFAULTLIB:libcd.lib /NODEFAULTLIB:libcmtd.lib /NODEFAULTLIB:msvcrtd.lib
现象2:
mfcs100.lib(dllmodul.obj) : error LNK2005: _DllMain@12 已经在 dllmain.obj 中定义
解决方案1:
1删除工程中的DllMain函数
现象3:
libvcruntimed.lib(_chkesp_.obj) : error LNK2005: __CRT_RTC_INIT 已经在 libcmtd.lib(_init_.obj) 中定义
解决方案3:
在项目属性页-》连接器-》命令行-》附加选项中 添加/force
转载于:https://blog.51cto.com/boyka3721/1681931