运行时库链接错误的修复方法


现象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