在使用VC6.0做东西时,产生几个典型的错误,特列如下,以备后查。
错误1:fatal error C1010:unexpected end of file while looking for precompiled header
问题很奇怪,在控制台项目下编译时,完全正确,把文件添加到MFC项目下就出现了上述错误。
字面解释:
致命错误C1010:在寻找预编译指示头文件时,文件未预期结束。
也就是没有找到预编译指示信息的头文件。
发生原因:
通过添加文件的方式,添加了一些cpp文件到一个MFC的程序,但该cpp文件并不是MFC,而是标准的C++。
深究原因:
在VC6.0的MFC项目设定中,会默认设置 .cpp文件 编译时,要有stdafx.h ,以增加编译速度。
而标准的C++ 的 .cpp 文件是不包含 stdafx.h 的,所以才会出现如上错误。
解决方案:
方案1: 右键单击项目工程中的cpp文件,/菜单 /项目 /设置 C/C++标签页中,把 分类对应的下拉框中,选择 预编译的头文件,选择 不使用预编译页眉(应该译为:预编译头文件)
注意,是 .cpp文件的设置,而不是整个项目的设置。MFC中自动生成的 .cpp文件必须使用 stdafx.h 进行预编译!
方案2:在.cpp文件开头添加包含文件stdafx.h。 #include"stdafx.h"
个人比较喜欢方案1。
补充:stdafx.h头文件
名称的英文全称为:Standard Application Framework Extensions
所谓头文件预编译,就是把一个工程(Project)中使用的一些MFC标准头文件(如Windows.H、Afxwin.H)预先编译,以后该工程编译时,不再编译这部分头文件,仅仅使用预编译的结果。这样可以加快编译速度,节省时间。
错误2:winsock2.h(2310) : error C2375: redefinition; different linkage
字面解释:
类型或结构体重定义
出现情形:
同样是控制台项目文件添加到MFC项目中出现的问题。
由于项目中会涉及到socket编程,所以在创建MFC可执行文件时,选中了“Windows Socket的支持选项”。因此,VC6.0 会自动在stdafx.h 中增加:
#include <afxsock.h>// MFC socket extensions
afxsock.h会自动包含 winsock2.h
这和从控制台项目下添加的文件(#include winsock2.h)中都会包含winsock2.h,所以很多东西都会提示说 redefinition ,即重定义。
解决方法:
方法一:可以在新添加的文件中删掉#include winsock2.h
方法二:可以删除stdafx.h中的 #include <afxsock.h>
比较倾向于第二种,因为控制台下已经编译、链接无误,这样改动比较少。
错误3:链接错误
这个问题比较纠结,不知从何下手。刚开始一直以为是stdafx.h跟winsock2.h两头文件矛盾的结果,所以调半天,结果还是不行。
一般碰到链接错误,多半是找库文件找不到。在 /工程 /设置 /链接 中,增加库文件Ws2_32.lib 后,链接成功!