VC MFC编译连接常见错误汇总

1. 错误一

(1) 错误举例

  错误 4 error LNK2005: _DllMain@12 已经在 MSVCRTD.lib(dllmain.obj) 中定义 D:\work\codes\vad_sdk_soundrecord_ocx\vad_sdk_soundrecord_ocx\AsrControl\mfcs120ud.lib(dllmodul.obj) AsrControl

 错误 5 error LNK1169: 找到一个或多个多重定义的符号 D:\work\codes\vad_sdk_soundrecord_ocx\vad_sdk_soundrecord_ocx\bin\AsrControl.ocx 1 1 AsrControl

(2) 分析

         简单地说,就是产生错误的工程同时使用了CRT库和MFC库,并且链接顺序不对,CRT 库对 new、delete 和 DllMain 函数使用弱外部链接。MFC 库也包含 new、delete 和 DllMain 函数。这些函数要求先链接 MFC 库,然后再链接 CRT 库。

         以上错误可以看出在链接库mfcs120ud.lib的时候,发现_DllMain已经在MSVCRTD.lib中已经定义

  在“项目 -> 属性 -> 链接器 -> 命令行”栏中,输入 /verbose:lib编译参数,这样,就可以在output窗口看到链接时搜索的库的先后顺序,对于本问题,你一定可以看到类似下面的先后输出:

1>  正在搜索库
1>      正在搜索 D:\work\codes\vad_sdk_soundrecord_ocx\vad_sdk_soundrecord_ocx\bin\libusc.lib: 
1>      正在搜索 ..\gvad\gvad.lib: 
1>      正在搜索 D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\lib\msvcprtd.lib: 
1>      正在搜索 D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\lib\MSVCRTD.lib: 
1>      正在搜索 D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\lib\OLDNAMES.lib: 
1>      正在搜索 D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\atlmfc\lib\mfc120ud.lib: 
1>      正在搜索 D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\atlmfc\lib\mfcs120ud.lib: 

1>mfcs120ud.lib(dllmodul.obj) : error LNK2005: _DllMain@12 已经在 MSVCRTD.lib(dllmain.obj) 中定义

       通过以上依赖关系可以看出:编译器先链接MSVCRTD.lib库,后链接mfcs120ud.lib,然后链接mfcs120ud.lib的时候报错了

(3) 解决方法

      让编译器先链接mfcs120ud.lib,后链接MSVCRTD.lib即可解决

在“项目->属性->连接器->输入->附加依赖项”,追加:mfcs120ud.lib;MSVCRTD.lib;

    搞定!

再例如:

错误 135 error LNK2005: "void __cdecl operator delete[](void *)" (??_V@YAXPAX@Z) 已经在 LIBCMTD.lib(delete2.obj) 中定义 D:\work\codes\vad_sdk_soundrecord_ocx\vad_sdk_soundrecord_ocx\AsrControl\uafxcwd.lib(afxmem.obj) AsrControl

分析可知:在链接uafxcwd.lib的时候发现有内容已经在LIBCMTD.lib中定义,调整链接顺序为 uafxcwd.lib;LIBCMTD.lib; 即可

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值