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

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.****.net/t/20041228/18/3683407.html
  楼主 john****(**