参考:http://blog.youkuaiyun.com/pgmsoul/article/details/4203941
原文有点长,稍微总结了一下要点:
现象:
LIBCMTD.lib(dbgheap.obj) : error LNK2005: __CrtSetCheckCount 已经在 MSVCRTD.lib(MSVCR90D.dll) 中定义
等等这样的一大串错误
原因:
visual studio中代码生成有/MT,/MTd,/Md,/MDd四个编译选项,分别代表多线程、多线程调试、多线程DLL、多线程调试DLL,
编译时引用的lib分别为libcmt.lib、libcmtd.lib、msvcrt.lib、msvcrtd.lib。
当你使用外部的库时,你引用的库用的编译选项和你当前项目用到编译选项不同,因此分别了相类似功能的不同lib,这些lib因为功能相似,
所以符号也有很多重复,因此就发生了以上现象。
解决方案:(任选一种)
1.最简单的,更改你的项目设置:菜单->项目->属性->配置属性->c/c++->代码生成->运行时库,这里有四个选项,多试几遍改到不会报错为止
2.同样的原理,重新编译你引用的库,将编译开关改为和你的项目一致
但是有的时候你可能没法更改项目或库的编译开关。
3.vs给你的建议,忽略掉其中一个冲突的库:菜单->项目->属性->配置属性->链接器->输入->忽略特定库,这里填入vs提示给你的命令:/NODEFAULTLIB: 后面填库的名字,也就是两个冲突的库的其中一个。