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;
搞定!