`
wenxiehao
  • 浏览: 16826 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

几个问题及解决方法

 
阅读更多

   
  在编译VC 工程时出现的编译错误
  问题如下:
  1、Linking...
  MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: _fclose already defined in LIBCD.lib(fclose.obj)
  MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: _free already defined in LIBCD.lib(dbgheap.obj)
  MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: _malloc already defined in LIBCD.lib(dbgheap.obj)
  MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: _strncpy already defined in LIBCD.lib(strncpy.obj)
  MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: _sprintf already defined in LIBCD.lib(sprintf.obj)
  MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: __isctype already defined in LIBCD.lib(isctype.obj)
  MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: __close already defined in LIBCD.lib(close.obj)
  MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: __write already defined in LIBCD.lib(write.obj)
  LINK : warning LNK4098: defaultlib "MSVCRTD" conflicts with use of other libs; use /NODEFAULTLIB:library
  Debug/module.exe : fatal error LNK1169: one or more multiply defined symbols found
  Error executing link.exe.
  原因及解决方法如下:主程序的库与 LIBCD 库链接方式不一致造成的。本例中LIBCD 是用动态链接的
  所以可以设置:project->setting-> Generation->Use MFC in a shared DLL
  2、c:\program files\microsoft visual studio\vc98\mfc\include\afxv_w32.h(14) : fatal error C1189: #error :  WINDOWS.H already included.  MFC apps must not #include 
  于是, 我在VC6.0 集成环境中的菜单项project 下的setting 中设置使用MFC 例"use mfc in a shared DLL"
  即:
  project->setting->general->Microsoft Foundation Classed:  选择 Use MFC in a shared DLL"
  同时,加入:
  #include // 使用MFC
  学会两点:
  (1) 、在project->setting->general->Microsoft Foundation Classed:  选择 Use MFC in a shared DLL
  (2 )、#include  顺序调换可能会解决问题
  3、windows.h和winsock2.h头文件包含顺序
   大凡在Windows 平台下用C++ 做网络开发很多时候都会同时包含这两个头文件,如若顺序不当(windows.h 先于winsock2.h) 就会出现很多莫名其妙的错误。诸如:
  警告    4    warning C4005: "AF_IPX":  宏重定义    c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h    91
  警告    5    warning C4005: "AF_MAX":  宏重定义    c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h    127
  警告    6    warning C4005: "SO_DONTLINGER":  宏重定义    c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h    163
   只要将二者的包含顺序调换一下问题就会解决,原因参见下面那个链接。另外,上述问题不仅影响直接包含二者的文件,还影响 间接包含的情形。比如,a.h 包含了windows.h ,b.h 包含了winsock2.h ,如果在c.h 当中要引用a.h 和b.h ,那么正确的顺序应当是b.h 先于a.h 。当然,实践当中有时很难找到究竟是哪两个文件顺序不对了,终极的解决办法是,在当前工程(就是编译不过的这个工程)所有 include 语句最前面加上#include  和#include ,世界清静了。
    在包含了 以及 的工程中, 编译有时会出现如
  下错误:
  error C2011: 'fd_set' : 'struct' type redefinition
  error C2011: 'timeval' : 'struct' type redefinition
  ....
  error C2375: 'accept' : redefinition; different linkage
  [原因分析]
  主要原因是因为 中包含了 头文件, 由于其版
  本的不同,导致出现上述的错误。 中相关代码如下:
  #ifndef WIN32_LEAN_AND_MEAN
  #include 
  #include 
  #include 
  ........
  #ifndef _MAC
  #include 
  #include 
  #endif
  .......
  #include 
  #endif
  #endif
  [解决方案]
  由以上代码可以看出如果在没有定义WIN32_LEAN_AND_MEAN 宏的大前
  提下windows.h 有可能包含winsock.h  头文件,因此我们得出一个很简单
  的解决方法就是在包含 之前定义WIN32_LEAN_AND_MEAN 宏, 如
  下所示:
  #define WIN32_LEAN_AND_MEAN
  #include 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics