error LNK2005:"void*__cdecl…

本文介绍了解决在非MFC程序中添加MFC支持时遇到的LNK2005错误的方法,包括调整CRT库和MFC库的链接顺序及移除不必要的预处理器定义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境:在非MFC程序(使用standard windows library)中,添加MFC支持,静态链接MFC库。

  发生以下错误:

  问题产生原因,CRT库和MFC库链接时顺序有误:

CRT 库对 new、delete 和 DllMain 函数使用弱外部链接。MFC 库也包含 new、delete 和 DllMain 函数。这些函数要求先链接 MFC 库,然后再链接 CRT 库。

当 C 运行时 (CRT) 库和 Microsoft 基础类 (MFC) 库的链接顺序有误时,可能会出现以下 LNK2005 错误。


  具体解决方法:(另一种解决方法参见最后链接,本人未测试)

  在vs2005项目设置中【Linker】-【input】-【additional dependencies】追击nafxcw.lib,libcmt.lib,Debug下,追加uafxcwd.lib,libcmtd.lib

  再次编译通过,但出现

  LINK : warning LNK4098: defaultlib 'uafxcw.lib' conflicts with use of other libs; use /NODEFAULTLIB:library

  在【Linker】-【input】-【Ignore specific library】中追加uafxcw.lib。

接下来再次编译,还是出现以下编译出错:

[plain]  view plain copy
  1. >nafxcwd.lib(dllmodul.obj) error LNK2005: _DllMain@12 已经在 CTXGina.obj 中定义  

解决方法:

到C++设置页中,看到Preprocessor Definitions编辑框中同时存在_USRDLL和_AFXDLL, 删除_USRDLL即可

1>libqrencode.lib(qrencode.obj) : 找到 MSIL .netmodule 或使用 /GL 编译的模块;正在使用 /LTCG 重新启动链接;将 /LTCG 添加到链接命令行以改进链接器性能 1>DrawModeCheckDialog.obj : error LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject const * __thiscall DrawModeCheckDialog::metaObject(void)const " (?metaObject@DrawModeCheckDialog@@UBEPBUQMetaObject@@XZ) 1>DrawModeCheckDialog.obj : error LNK2001: 无法解析的外部符号 "public: virtual void * __thiscall DrawModeCheckDialog::qt_metacast(char const *)" (?qt_metacast@DrawModeCheckDialog@@UAEPAXPBD@Z) 1>DrawModeCheckDialog.obj : error LNK2001: 无法解析的外部符号 "public: virtual int __thiscall DrawModeCheckDialog::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@DrawModeCheckDialog@@UAEHW4Call@QMetaObject@@HPAPAX@Z) 1>NCApplication.obj : error LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject const * __thiscall NCApplication::metaObject(void)const " (?metaObject@NCApplication@@UBEPBUQMetaObject@@XZ) 1>NCApplication.obj : error LNK2001: 无法解析的外部符号 "public: virtual void * __thiscall NCApplication::qt_metacast(char const *)" (?qt_metacast@NCApplication@@UAEPAXPBD@Z) 1>NCApplication.obj : error LNK2001: 无法解析的外部符号 "public: virtual int __thiscall NCApplication::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@NCApplication@@UAEHW4Call@QMetaObject@@HPAPAX@Z) 1>NCApplication.obj : error LNK2001: 无法解析的外部符号 "public: static struct QMetaObject const NCApplication::staticMetaObject" (?staticMetaObject@NCApplication@@2UQMetaObject@@B) 1>sliderStepButton.obj : error LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject const * __thiscall sliderStepButton::metaObject(void)const " (?metaObject@sliderStepButton@@UBEPBUQMetaObject@@XZ) 1>sliderStepButton.obj : error LNK2001: 无法解析的外部符号 "public: virtual void * __thiscall sliderStepButton::qt_metacast(char const *)" (?qt_metacast@sliderStepButton@@UAEPAXPBD@Z) 1>sliderStepButton.obj : error LNK2001: 无法解析的外部符号 "public: virtual int __thiscall sliderStepButton::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@sliderStepButton@@UAEHW4Call@QMetaObject@@HPAPAX@Z) 1>E:\lyf-Qt\laser\QtVisionLaser\Win32\Debug\\LaserVision.exe : fatal error LNK1120: 10 个无法解析的外部命令 怎么查看哪些头文件需要手动编译
最新发布
06-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值