关于error LNK2005的解决办法

摘要:
经过分析,估计这是一个库冲突问题。起初,我通过忽略特定的库方法忽略了MSVCRTD.lib,并且出现了另一个错误:1˃uafxcwd.lib:errorLNK2001:未解析的外部符号__Wargv1˃uafxcwd.lib:errorLNK2001:尚未解析的外部标记___ Argc我发现这个解决方案有陷入恶性循环的趋势。当然,如果在使用MFC时选择“在静态库中使用MFC”,同时选择“多线程调试”,则不会发生任何事情。

作者:朱金灿
来源:http://blog.csdn.net/clever101/


      一位网友看了我的《VC和LUA混合开发之VC程序调用Lua脚本函数》,说参考了我做的,封装成自己的一个DLL 也是先把LUA编译成静态库,这个静态库我没改动。在MFC DLL中,我编译的话如果是静态MFC就会报错,如果是共享MFC 就不会 请问如何解决啊
报错信息如


//1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: _strchr 已经在 libcmt.lib(strchr.obj) 中定义
//1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: _fread 已经在 libcmt.lib(fread.obj) 中定义
//1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: _feof 已经在 libcmt.lib(feoferr.obj) 中定义


       我试了一下,确实如此。经分析,估计这是库冲突的问题,开始我采用忽略特定库办法,把MSVCRTD.lib忽略了,结果出现了另外错误:
1> uafxcwd.lib(appcore.obj) : error LNK2001: 无法解析的外部符号 ___wargv
1>uafxcwd.lib(appcore.obj) : error LNK2001: 无法解析的外部符号 ___argc


       我发现这种解决办法有陷入恶性循环的势头。我分析了一下,估计是LUA工程和调用lua库的工程采用不同的运行时库的不同造成的,也就是解决这种问题的最好办法是:保证底层库和上层调用程序所用的运行时库的一致,就是两个工程的下图的选项设置必须一致,如下图:


   关于error LNK2005的解决办法第1张


         当然如果你在MFC的使用选择"在静态库中使用 MFC",同时你又选择"多线程调试DLL (MDd)",编译器会提示一个错误:

1> c:/program files/microsoft visual studio 8/vc/atlmfc/include/afx.h(24) : fatal error C1189: #error : Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d]


       这个提示很具体,就是你要么添加一个预处理器_AFXDLL,要么关闭/MD[d]。当然如果你在MFC的使用选择"在静态库中使用 MFC",同时你又选择"多线程调试(/MTd)",则啥事都没有。


      总之,我觉得解决这类错误,最好的解决办法是保证底层库和上层调用程序所用的运行时库的一致,而不是会想忽略什么特定库,因为忽略特定库,既麻烦又可能陷入一个恶性循环(因为你不太清楚究竟该忽略哪些库,往往忽略这个库又冒出了其它问题)。




免责声明:文章转载自《关于error LNK2005的解决办法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇iOS定位元素Spring boot如何快速的配置多个Redis数据源下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Python安装sqlite3

今天使用PYthon时,发现错误 ImportError: No module named sqlite 这是因为缺少 SQLITE3的缘故。 下面分享一下解决此问题的方法步骤: 1. 查看是Python是否有该库 使用http://django-china.cn/topic/413/ 查看自己Python库的路径, >>> impor...

IOCP九:Client退出后投递WSASend

实验过程:         过程一:                 1.Server等待Client到来                2.Client进入                3.Server接受连接,发送"nihaihaoma"                4.Client接收"nihaihaoma",马上退出             ...

C++ 实现的netstat -an 的功能<转>-目的为获取rtmp推流地址如果是域名的话查看1935的ip

目的可能是为了获取rtmp真正的推流ip 如果rtmp推流地址是域名,往CDN推流的话,需要nslookup  的那种DNS解析,然后获取的几个ip 可以使用netstat -n 等命令查看 1935端口的真正ip是多少,废话不多说,下面是代码: -------------------- 代码中可能只需要关心 EnumTCPTable() 然后判断 i...

QT5静态编译教程,主要针对vs2012(渡世白玉)

QT5,VS2012静态编译,所有的库准备充分的话qwebkit也可以静态编译通过,但是我编译的版本使用中如果用了QWEBVIEW控件在连接时会出错。注:我自己编译的环境是:win server 2012 dc版 , vs2012 with update1,qt-everywhere-opensource-src-5.0.2,perl和rupy都是在qt官...

MFC控件(2):Text_Edit_Control

Static Text用法简介 static text是一段不可编辑的文字,主要用来起提示作用.在C#中类似的控件叫Label. 如果只是没啥特殊要求,并且内容固定.就简单的在属性窗口中中Caption中输入内容即可.另外在代码中常用到的一些操作如下(假设static text ID为IDC_STATIC_NOTE) 直接通过函数操作 GetDlgItem...

经典MFC界面和Ribbon界面框架对比(单文档为例)

IDE为:VS2008+SP1 A为经典MFC单文档界面: B为Ribbon风格的MFC单文档界面: 在生成A和B的基础框架代码之后,通过对比工具,发现这两种不同风格的界面主要在MainFrame类中存在一些差异。 应用程序类(CXXXApp)的InitInstance()函数中,B风格在调用InitContextMenuManager()之后,执行了...