也谈error LNK2005错误一例

来源:互联网 发布:java是开源的吗 编辑:程序博客网 时间:2024/04/27 14:53

我在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个库是不一样且有共同的函数的。因此导致连接错误。

 

原创粉丝点击