几个问题及解决方法

  
  在编译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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值