VC编译错误:msvcrtd.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class typ

来源:互联网 发布:simmons淘宝代购假货 编辑:程序博客网 时间:2024/05/28 15:34

2010-03-29 14:54:02|  分类: 编译错误|字号 订阅


1>msvcrtd.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) 已经在 libcmtd.lib(typinfo.obj) 中定义
1>msvcrtd.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) 已经在 libcmtd.lib(typinfo.obj) 中定义
1>msvcrtd.lib(MSVCR80D.dll) : error LNK2005: __CrtDbgReportW 已经在 libcmtd.lib(dbgrptw.obj) 中定义
1>msvcrtd.lib(MSVCR80D.dll) : error LNK2005: _wcslen 已经在 libcmtd.lib(wcslen.obj) 中定义
1>msvcrtd.lib(MSVCR80D.dll) : error LNK2005: _vsprintf_s 已经在 libcmtd.lib(vsnprnc.obj) 中定义
1>msvcrtd.lib(MSVCR80D.dll) : error LNK2005: _sprintf_s 已经在 libcmtd.lib(sprintf.obj) 中定义
1>msvcrtd.lib(MSVCR80D.dll) : error LNK2005: _vswprintf_s 已经在 libcmtd.lib(vswprnc.obj) 中定义
1>msvcrtd.lib(MSVCR80D.dll) : error LNK2005: _swprintf_s 已经在 libcmtd.lib(swprintf.obj) 中定义
1>libcmtd.lib(crt0init.obj) : warning LNK4098: 默认库“msvcrtd.lib”与其他库的使用冲突;请使用 /NODEFAULTLIB:library

参考:http://blog.csdn.net/wuxch_hz/archive/2010/02/24/5321586.aspx

http://topic.csdn.net/t/20030507/17/1751913.html

 

解决方法:忽略冲突的库。例如,这里忽略msvcrtd.lib,因为它是我自己的lib里面链接的,而现在编译的exe应该使用libcmtd.lib库。

或者,在exe里面使用dll的配置,即,加入宏定义_AFXDLL,并使用/MDd多线程调试dll配置。

主要是由于运行时库冲突。

 

2010.3.29 19:01 注:

上面的方法还是不行!会出现其他问题的。

以下是我摸索出的最新的解决方法:

首先,所有的lib文件,使用/MTd或/MT编译。Debug调试模式使用/MTd,Release模式使用/MT。

然后,在自己的程序中也使用/MTd或/MT编译。这样就不会出问题了。

三种编译链接库的方式:

(1)连接Windows库。针对Win32 API编写的应用程序,上面的方法可能带来新问题,可以忽略libcmt.lib库,即可。如果还有其他问题,再忽略相应的库。

(2)MFC静态链接。上面的方法就是针对这种链接方式的,所以没问题。

(3)MFC动态链接。没有试过,应该和(1)类似。

 

最后补充:如果还不行,直接加入/force:multiple编译参数吧。这次之所以没有使用它,也是为了严谨起见。

 

By:zhanyonhu