error LNK2005; VC6工程引入.lib时链接出错

当在VC6工程中引入第三方库my.lib时,遇到LNK2005错误,提示locale::facet接口已由msvcprtd.lib定义。原因是exe工程使用MFC共享DLL,而lib工程不使用MFC。解决方案是确保exe和lib都采用相同的MFC使用方式,如统一为动态或静态方式,并调整lib工程设置以匹配exe,重新生成lib即可解决问题。

将第三方源码生成my.lib,引入自己的工程.exe,报错

libcp.lib(locale0.obj) : error LNK2005: "public: class std::locale::facet const * __thiscall std::locale::_Getfacet(unsigned int,bool)const " (?_Getfacet@locale@std@@QBEPBVfacet@12@I_N@Z) already defined in msvcprtd.lib(MSVCP60D.dll)

大意:在链接 libcp.lib时,发现某个接口_Getfacet已经在msvcprtd.lib中定义


PS: 如果工程(.exe)直接引入源码(.h/.cpp)直接编译链接,可以正常运行;


问题原因

项目工程(.exe)和lib使用MFC方式不同,(一个动态方式,一个静态方式)

exe工程属性是Use MFC in a shared dll,运行时从dll找函数,

my.lib工程属性是Not Using MFC,使用的是staitc函数,导致msvcprtd.lib中某些函数,例如_Getfacet已被包含到my.lib中,

当exe查找dll指向的函数时,发现已在my.lib中存在,就会导致冲突


解决方法:

exe和lib两个工程用同样方式使用库,比如都动态或者都静态,高版本vc就是都用/MD或者/MT

比如本人VC6中将lib工程 Project Setttins->General->Microsoft Foundation Classes 从Not Using MFC改为Use MFC in a shared dll,再重新生成my.lib,就可以正常使用


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值