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中暴露的问题

浙公网安备 33010602011771号