也谈error LNK2005错误一例

我在vc2008上编译一个小程序,在该程序中连接的另一个lib(使我自定义的)。报如下错误:

1>Linking...
1>msvcrtd.lib(MSVCR90D.dll) : error LNK2005: _wcslen already defined in libcmtd.lib(wcslen.obj)
1>msvcrtd.lib(MSVCR90D.dll) : error LNK2005: _sprintf already defined in libcmtd.lib(sprintf.obj)
1>msvcrtd.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) already defined in 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) already defined in libcmtd.lib(typinfo.obj)
1>LINK : warning LNK4098: defaultlib 'mfc90ud.lib' conflicts with use of other libs; use /NODEFAULTLIB:library
1>LINK : warning LNK4098: defaultlib 'mfcs90ud.lib' conflicts with use of other libs; use /NODEFAULTLIB:library
1>LINK : warning LNK4098: defaultlib 'msvcrtd.lib' conflicts with use of other libs; use /NODEFAULTLIB:library
1>E:/wp/wpone/Debug/wpone.exe : fatal error LNK1169: one or more multiply defined symbols found

 

在网上寻求解决办法:或略libcmtd.lib,结果是能解决,但不明问题的原因。因此认为问题只是消除了表面,没能找到根源,我决定自己探索。

 

问题出现前,工程是能正确编译的。因而,我注释掉我新加的代码,编译正确。确定是新加的代码影响了。

 

分析新加代码,发现是调用了我另一lib(使我自定义的)。

 

比较小程序工程和lib工程的:project->references...->configuration properties->c/c++->cammond line.

 

发现2各差异:

小程序是/MTd,lib工程是/D "_AFXDLL" /MDd

 

修改小程序project->references...->configuration properties->c/c++->code generation 的runtime library到/MDd,和

project->references...->configuration properties->general的use of MFC到Use MFC in a Shared DLL。

 

在编译,就ok了。

 

分析原因:是lib用了动态连接mfc库,而小程序用的静态的,这2个库是不一样且有共同的函数的。因此导致连接错误。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值