VC错误

链接错误

error LNK2001:  unresolved external symbol

程序里有不确定的外部符号,连接程序不能在所有的dll和lib内找到这个符号。(有定义,在.h中;无lib,检查 项目设置-Link页)

 

 

编译错误

error C2011:  'XXX'  type redefinition 
符号重定义,一般是头文件冲突。以【winsock.h 和 winsock2.h 的冲突】为例:

一般头文件会有防止重复包含的保护宏

winsock.h            winsock2.h

                #ifndef _WINSOCK2API_

#ifndef _WINSOCKAPI_    #define _WINSOCK2API_
#define _WINSOCKAPI_    #define _WINSOCKAPI_ //如果先包含winsock2.h,就不会包含winsock.h

   ……           #ifndef _INC_WINDOWS
                #include <windows.h> //如果没有包含windows.h(_INC_WINDOWS在windows.h中定义)

                 #endif           就自动包含它,以定义WinSock需要的类型和常量

#endif             #endif
现在切换到windows.h,包含了所有Win头文件的头文件,查找winsock

#ifndef WIN32_LEAN_AND_MEAN //作用是减小win32头文件尺寸以加快编译速度,一般由AppWizard在 stdafx.h中#define

   #if(_WIN32_WINNT >= 0x0400)
    #include <winsock2.h>
    #include <mswsock.h>
  #else
    #include <winsock.h>
  #endif 
 

#endif

错误情形1:先包含winsock2.h再包含windows.h,如果stdafx.h 中未定义 WIN32_LEAN_AND_MEAN,且_WIN32_WINNT >= 0x400,那么 winsock2.h中会包含windows.h,而windows.h又会引入mswsock.h,此时,mswsock.h里所用的socket类型还尚未定义(在winsock2.h里#include <windows.h>的后面),因此会出现类型未定义错误。

错误情形2:先包含windows.h再包含winsock2.h,如果stdafx.h 中未定义 WIN32_LEAN_AND_MEAN,且_WIN32_WINNT >= 0x400,那么windows.h会导入winsock.h,这样winsock2.h再被包含时会引起重定义。

 问题还没有结束,要知道除了VC自带windows库文件外,MS的Platform SDK也含有这些头文件。之前能够好好编译的程序在改变了windows.h包含路径,换了一个windows.h文件后又出了问题。原因很简单,Platform SDK中的windows.h与VC自带的文件存在差异

#ifndef WIN32_LEAN_AND_MEAN
#ifndef _MAC
#include <winsock.h> // 这里直接包含winsock.h
#endif
 

 

error LNK2005: XXX symbol already defined in XXX.obj

error LNK1169: one or more multiply defined symbols found

 

 

#ifndef   _XXX_H
#define  

...原来内容

#endif
防止重复包含。

#pragma   once
防止重复编译

 

BK错误

error BK1506: 代码中有微小错误,编译能通过但sbr无法生成,会提示找不到某sbr文件。VS浏览器会需要这些文件。VC6升级VS中暴露的问题

posted on 2011-03-10 16:29  cvbnm  阅读(1114)  评论(0)    收藏  举报

导航