mark,[转]MS VC6 链接错误处理(debug静态链接)

mark,[转]MS VC6 链接错误处理(debug静态链接)
2011年03月31日
  原帖地址:http://king-dxs.spaces.live.com/blog/cns!827cef33a5708083!178.entry
  在Windows XP下编译的软件,放到Windows 2000上使用时,跳出了"无法找到动态链接库MSVCRTD.dll"的提示,后来还是直接将MSVCRTD.dll从WinXP系统目录下copy过来使用来解决问题的。
  不过在解决问题过程中,有其他意外收获,现在记下来,说不定以后可参考一二。
  刚开始时,我将MFC DLL改为静态库链接,编译,出现如下结果:
  MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: _realloc already defined in libcmt.lib(realloc.obj)
  MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: _free already defined in libcmt.lib(free.obj)
  MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: _malloc already defined in libcmt.lib(malloc.obj)
  MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: _strchr already defined in libcmt.lib(strchr.obj)
  MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: _sprintf already defined in libcmt.lib(sprintf.obj)
  MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: _tolower already defined in libcmt.lib(tolower.obj)
  MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: _getenv already defined in libcmt.lib(getenv.obj)
  MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: _toupper already defined in libcmt.lib(toupper.obj)
  MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: __isctype already defined in libcmt.lib(isctype.obj)
  MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: _atoi already defined in libcmt.lib(atox.obj)
  MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: _strstr already defined in libcmt.lib(strstr.obj)
  MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: _calloc already defined in libcmt.lib(calloc.obj)
  MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: _strncpy already defined in libcmt.lib(strncpy.obj)
  MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: _strncmp already defined in libcmt.lib(strncmp.obj)
  MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: _memmove already defined in libcmt.lib(memmove.obj)
  MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: _strtoul already defined in libcmt.lib(strtol.obj)
  MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: _strtol already defined in libcmt.lib(strtol.obj)
  MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: _fclose already defined in libcmt.lib(fclose.obj)
  MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: _ungetc already defined in libcmt.lib(ungetc.obj)
  MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: __errno already defined in libcmt.lib(dosmap.obj)
  MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: _sscanf already defined in libcmt.lib(sscanf.obj)
  MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: _setlocale already defined in libcmt.lib(setlocal.obj)
  MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: _printf already defined in libcmt.lib(printf.obj)
  MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: _localtime already defined in libcmt.lib(localtim.obj)
  MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: _time already defined in libcmt.lib(time.obj)
  MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: _fflush already defined in libcmt.lib(fflush.obj)
  MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: __strdup already defined in libcmt.lib(strdup.obj)
  LINK : warning LNK4098: defaultlib "MSVCRTD" conflicts with use of other libs; use /NODEFAULTLIB:library
  ..\..\Output\Release/FirewallMan.exe : fatal error LNK1169: one or more multiply defined symbols found
  Error executing link.exe.
  相信一个善良的人对上面的错误不会熟视无睹的,我的解决方法当然是对症下药:
  Link->Category: Input->Ignore libraries:libcmt
  clean后重新编译,还有下面的链接错误:
  Linking...
  nafxcw.lib(appcore.obj) : error LNK2001: unresolved external symbol ___argv
  nafxcw.lib(appcore.obj) : error LNK2001: unresolved external symbol ___argc
  nafxcw.lib(apphelp.obj) : error LNK2001: unresolved external symbol __mbctype
  nafxcw.lib(filelist.obj) : error LNK2001: unresolved external symbol __mbctype
  nafxcw.lib(dcprev.obj) : error LNK2001: unresolved external symbol __mbctype
  nafxcw.lib(timecore.obj) : error LNK2001: unresolved external symbol __mbctype
  ..\..\Output\Release/FirewallMan.exe : fatal error LNK1120: 3 unresolved externals
  Error executing link.exe.
  呵呵,这个错误真厉害,我用google搜索了一下,发现才3页,而且提出问题后后面基本上没有什么解决方法,其中我还硬着头皮看了俄语的链接,但遗憾的是从字面上看没有解答,而后上了微软网站,看到有提问,但是没有回答的。
  后来尝试了很多方法,经过摸索,最后得出解决方法:
  在Preprocessor中定义_AFXDLL
  如果它提示:fatal error C1189: #error : Please use the /MD switch for _AFXDLL builds
  就这样改:
  C/C++->Code Generation->Multithread DLL (即实现/MD选项)
  msvcrtd.lib(MSVCRTD.dll) : warning LNK4006: _sprintf already defined in libcmt.lib(sprintf.obj);
  second definition ignored
  下面翻译一段关于这个错误的文章,希望对你有所帮助
  可以使用链接器的/VERBOSE:LIB 开关来确定链接器所搜索的的库(property->linker->command line->additional options编辑框中加入/VERBOSE:LIB ),可以告诉链接器忽略不正确的链接器,在property->linker->Input->Ignore Specific Libary里输入不正确的运行库或者使用/NODEFAULTLIB:library 开关。
  下表显示根据你所用的运行库哪些是用忽略的
  To use this run-time library Ignore these libraries
  Single-threaded (libc.lib) libcmt.lib, msvcrt.lib, libcd.lib,
  libcmtd.lib, msvcrtd.lib
  Multithreaded (libcmt.lib) libc.lib, msvcrt.lib, libcd.lib,
  libcmtd.lib, msvcrtd.lib
  Multithreaded using DLL (msvcrt.lib) libc.lib, libcmt.lib, libcd.lib,
  libcmtd.lib, msvcrtd.lib
  Debug Single-threaded (libcd.lib) libc.lib, libcmt.lib, msvcrt.lib,
  libcmtd.lib, msvcrtd.lib
  Debug Multithreaded (libcmtd.lib) libc.lib, libcmt.lib, msvcrt.lib,
  libcd.lib, msvcrtd.lib
  Debug Multithreaded using DLL (msvcrtd.lib) libc.lib, libcmt.lib, msvcrt.lib,
  libcd.lib, libcmtd.lib
  例如如果你想创建一个使用non-debug, single-threaded版本的运行库,并收到了警告,可以使用下面的开关,(设置同/VERBOSE:LIB)
  /NODEFAULTLIB:libcmt.lib /NODEFAULTLIB:msvcrt.lib /NODEFAULTLIB:libcd.lib /NODEFAULTLIB:libcmtd.lib /NODEFAULTLIB:msvcrtd.lib
  下面的链接解决了LNK2005的问题
  http://support.microsoft.com/default.aspx?scid=kb;zh-cn;148652
  Debug版本和Release版本有什么区别
  原帖地址:http://topic.csdn.net/t/20041228/18/3683407.html
  楼主 johncsdn(**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值