12345678910111213141516171819202122232425262728293031323334353637383940 |
- 【错误信息】:
- error LNK2005: _DllMain@12 已经在 MSVCRTD.lib(dllmain.obj) 中定义
- 【分析原因】:
- 这篇文章:《https://support.microsoft.com/zh-cn/help/148652/a-lnk2005-error-occurs-when-the-crt-library-and-mfc-libraries-are-link 详细分析和说明了产生这种错误的原因。
- 简单地说,就是产生错误的工程同时使用了CRT库和MFC库,并且链接顺序不对,CRT 库对 new、delete 和 DllMain 函数使用弱外部链接。MFC 库也包含 new、delete 和 DllMain 函数。这些函数要求先链接 MFC 库,然后再链接 CRT 库。
- 【解决方法】:
- 在“项目 -> 属性 -> 链接器 -> 命令行”栏中,输入 /verbose:lib编译参数,这样,就可以在output窗口看到链接时搜索的库的先后顺序,对于本问题,你一定可以看到类似下面的先后输出:
- > Searching D:\vs2008\VC\lib\MSVCRTD.lib:
- > Searching D:\vs2008\VC\atlmfc\lib\mfcs90ud.lib:
- 由此可以看出,默认情况下,先链接了CRT库MSVCRTD.lib,然后链接的是MFC的库mfcs90ud.lib,因此,需要强制改变一下它们的链接顺序。
- 选择“项目 -> 属性 -> 链接器 -> 输入”栏,在其中的“忽略特定的库”这一栏输入:MSVCRTD.lib mfcs90ud.lib, 然后,在“附加库”这一栏中输入: mfcs90ud.lib MSVCRTD.lib 问题即可解决。
- 【错误信息】
- protobuf默认VS编译出来的是dll动态库(预处理器定义使用:PROTOBUF_USE_DLLS),而本项目中WxAdoInterface本身也是dll,WxAdoInterface调用protobuf,WxAdoInterface由WxService调用。
- 整个项目编译期间没有出任何问题,运行时报错:std::call_once被调用二次,导致google::protobuf::FatalException。
- 【分析原因】:
- std::call_once被调用二次,说明有函数被执行二次,导致google::protobuf::FatalException。
- 可能原因是:WxService调用了一次protobuf初始化环境,而WxService再次调用WxAdoInterface又被初始化了一次。
- 【解决方法】:
- 将protobuf由dll改成lib方式链接(不要使用预处理:PROTOBUF_USE_DLLS).
|