关于error LNK2005的解决办法
作者:朱金灿
来源: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库的工程采用不同的运行时库的不同造成的,也就是解决这种问题的最好办法是:保证底层库和上层调用程序所用的运行时库的一致,就是两个工程的下图的选项设置必须一致,如下图:
当然如果你在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)",则啥事都没有。
总之,我觉得解决这类错误,最好的解决办法是保证底层库和上层调用程序所用的运行时库的一致,而不是会想忽略什么特定库,因为忽略特定库,既麻烦又可能陷入一个恶性循环(因为你不太清楚究竟该忽略哪些库,往往忽略这个库又冒出了其它问题)。