常见的vc++编译错误

1、fatal error C1010: unexpected end of file while looking for precompiled header directive。

寻找预编译头文件路径时遇到了不该遇到的文件尾。(一般是没有#include "stdafx.h")

2、fatal error C1083: Cannot open include file: 'R…….h': No such file or directory

不能打开包含文件“R…….h”:没有这样的文件或目录。

3、error C2011: 'C……': 'class' type redefinition

类“C……”重定义。

4、error C2018: unknown character '0xa3'

不认识的字符'0xa3'。(一般是汉字或中文标点符号)

5、error C2057: expected constant expression

希望是常量表达式。(一般出现在switch语句的case分支中)

6、error C2065: 'IDD_MYDIALOG' : undeclared identifier

“IDD_MYDIALOG”:未声明过的标识符。

7、error C2082: redefinition of formal parameter 'bReset'

函数参数“bReset”在函数体中重定义。

8、error C2143: syntax error: missing ':' before '{'

句法错误:“{”前缺少“;”。

9、error C2146: syntax error : missing ';' before identifier 'dc'

句法错误:在“dc”前丢了“;”。

10、error C2196: case value '69' already used

值69已经用过。(一般出现在switch语句的case分支中)

11、error C2509: 'OnTimer' : member function not declared in 'CHelloView'

成员函数“OnTimer”没有在“CHelloView”中声明。

12、error C2511: 'reset': overloaded member function 'void (int)' not found in 'B'

重载的函数“void reset(int)”在类“B”中找不到。

13、error C2555: 'B::f1': overriding virtual function differs from 'A::f1' only by return type or calling convention

类B对类A中同名函数f1的重载仅根据返回值或调用约定上的区别。

14、error C2660: 'SetTimer' : function does not take 2 parameters

“SetTimer”函数不传递2个参数。

15、warning C4035: 'f……': no return value

“f……”的return语句没有返回值。

16、warning C4553: '= =' : operator has no effect; did you intend '='?

没有效果的运算符“= =”;是否改为“=”?

17、warning C4700: local variable 'bReset' used without having been initialized

局部变量“bReset”没有初始化就使用。

18、error C4716: 'CMyApp::InitInstance' : must return a value

“CMyApp::InitInstance”函数必须返回一个值。

19、LINK : fatal error LNK1168: cannot open Debug/P1.exe for writing

连接错误:不能打开P1.exe文件,以改写内容。(一般是P1.Exe还在运行,未关闭)

20、error LNK2001: unresolved external symbol "public: virtual _ _thiscall C……::~C……(void)"

连接时发现没有实现的外部符号(变量、函数等)。

关于VC编译错误fatal error C1083的解决办法

这时因为该模块没有包括预编译头文件“stdafx.h”的缘故。

VC用一个stdafx.cpp包含头文件stdafx.h,然后在stdafx.h里包含大部分系统头文件,这

样编译时VC就通过编译stdafx.cpp把大部分系统头文件预编译进来了,在Debug目录下有

一个很大的文件*.pch,这里就存储了预编译信息。

根据这个原理,如果这个pch损坏了或被删除了,系统重新编译时就会抱怨“cannot open

precompiled header file debug/*.pch”。这时怎么解决这个问题呢,

打开Project-》Setting对话框选C++页,将Category下拉式列表框选中Precompiled Headers,

最简单的办法就是选中第一个选项“Not using....",这样就根本不用预编译头也不去寻找pch文件,

就不会出错了,但是这样做的后果是每次编译、连接都化更多的时间。

第二个选项”Automatic ...",然后在“Through header”力填上stdafx.h,这样

如果没有pch文件系统会自动生成一个pch,如果有的话就使用这个pch,这个选项是比较“

智能”的。

第三个选项是强行创建一个pch文件,第四个选项是直接使用pch文件。当然“Through

headers”里都填stdafx.h了。

1.

nafxcwd.lib(appcore.obj) : error LNK2001: unresolved external symbol ___argv

nafxcwd.lib(appcore.obj) : error LNK2001: unresolved external symbol ___argc

nafxcwd.lib(timecore.obj) : error LNK2001: unresolved external symbol __mbctype

nafxcwd.lib(apphelp.obj) : error LNK2001: unresolved external symbol __mbctype

nafxcwd.lib(filelist.obj) : error LNK2001: unresolved external symbol __mbctype

解决办法:

PROJECT->SETING->C/C++->PREPROCESSOR->定义 _AFXDLL,完毕。

2.

LINK : warning LNK4098: defaultlib "MSVCRT" conflicts with use of other libs; use /NODEFAULTLIB:library

解决办法:

PROJECT->SETING->LINK->INPUT->IGNORE LIB...->MSVCRT.LIB

以下转其他,

1. Linking...

nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex

nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex

libcd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main

Q:

VC++默认的工程设置是单线程的,而你使用了多线程,所以要修改设置。选择菜单“Project|settings”,选择C/C++标签,在CODE GENERATION分类中选择除SINGLE-THREADED的其他选择。

2.fatal error C1010: unexpected end of file while looking for precompiled header directive

Q:

两个办法:

-->肯定是一个新添加的类的.cpp文件开头没包含stdafx.h,在该文件最前面加上即可

-->有时可以使用右键点击项目工程中的该cpp文件,选择setting,在c/c++栏,选择PreCompiled headers,然后设置第一选项,选择不使用预编译头,解决这个问题。

3.在编译时产生的下面的代码,那么下面的代码中的括号内的数字代表什么意思,还有error后的数字呢?

Compiling...

CalWnd.cpp

E:\StudyVC\CalendarApp\CalWnd.cpp(1092) : error C2065: 'TTS_BALLOON' : undeclared identifier

E:\StudyVC\CalendarApp\CalWnd.cpp(1092) : error C2059: syntax error : ')'

E:\StudyVC\CalendarApp\CalWnd.cpp(1092) : warning C4552: '|' : operator has no effect; expected

operator with side-effect

Error executing cl.exe.

Q:括号中的数字是出错的代码行的行号。例如错误中的第1行表示CalWnd.cpp的1092行出现了错误。如果想快速找到这行,可以在错误信息行上双击鼠标,这时VC++会自动打开CalWnd.cpp文件并定位到这行。

Error后面的数字表示错误代号。错误代号分为两类:C开头的是编译错误,即你的代码存在语法错误,你需要修改代码;LNK开头的是链接错误,通常你的代码并没有语法错误,可能是配置错误引起的,但有时LNK可能是由于拼写错误引起的。在错误信息行上按F1键,VC++会打开MSDN帮助并显示关于该错误信息的一个简单的解释,你可以根据该解释来知道到底是什么意思。

4.vc编译的时候可以设置两个版本:debug和release,debug版本在运行的时候点击帮助菜单的about对话框出现如下错误信息:

Debug Assertion Failed:

Program :C:\fuan\Debug\fuan.exe

File:wincore.cpp

Line:628

For information on how your program can cause an assertion failure,see visual c++ documentation on asserts.

(Please retry to debug application).

但是如果把配置改成release版本,就不会出现问题,about对话框弹出正常。使用的是同一个源程序,为什么会出现不同的结果?

Q:

在MFC中,大量使用了ASSERT宏,这些宏通常可以来纠正一些错误,如还没有初始化指针就使用等。你所遇到的信息就是ASSERT宏报告的错误。通常你要检查一下是否存在错误。在Release方法下,ASSERT宏不会执行,所以也没有错误信息。不过,MFC中的ASSERT宏有时管得有点宽,如果确认没有错误,也可以不理会它。

5. 在win2000上能编译的程序到了win98就不能编译了。

没有出错信息,一编译就停在

--Configuration: Monitor - Win32 Release-------

Copying contents file...

是不是跟*.hpj文件有关系,应该怎么改?

Q:是和编译帮助文件有关,据说如果在Win98下安装了Norton AntiVirtus 2000就会出现这种问题。可以把帮助文件从工程中去掉:

1、在FileView标签下,选择Source Files文件夹下面的.hpj文件。

2、右击文件并从菜单中选择Settings。

3、点击General标签。

4、清除掉Always use custom build step选项并选择Exclude file from build。

6.在用EnumWindows(EnumWindowsProc,(LPARAM)0);编译时老是出错:cannot convert parameter 1 from 'int (struct HWND__ *,long)' to 'int (__stdcall *)(struct HWND__ *,long)'

Q:实际上看一下错误信息就知道,你的EnumWindowsProc大概定义为:

int EnumWindowsProc(HWND, long);

实际应该定义为:

int __stdcall EnumWindowsProc(HWND, long);

7.编译以WinMain开头的函数出现LNK2001错误

LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main

Debug/Cpp1.exe : fatal error LNK1120: 1 unresolved externals

Q:估计是选错了工程类型。在VC中除了可以编译MFC程序外,还可以建立Win32 Application,以WinMain为主函数。可以在VC中建立Win32 Application,然后加入你的C程序,然后编译即可。

8.编译后出现大量错误信息怎么办

错误信息如下:

Info :Compiling C:\user\x.cpp

Error: x.cpp(20,26):Call to undefined function 'loadCursor'

Error: x.cpp(20,15):Cannot convert 'int' to 'HICON__ *'

Error: x.cpp(23,21):Cannot convert 'void *' to 'HBRUSH__ *'

Error: x.cpp(30,6):Undefined symbol 'hWnd'

Error: x.cpp(32,13):Cannot convert 'void *' to 'HINSTANCE__ *'

Error: x.cpp(32,13):Type mismatch in parameter 'hInstance' in call to

'__stdcall CreateWindowExA(unsigned long,const char *,const char

*,unsigned long,int,int,int,int,HWND__ *,HMENU__ *,HINSTANCE__ *,void

*)'

Error: x.cpp(33,32):Undefined symbol 'SHOW_MAXIMIZED'

Warn : x.cpp(40,2):'hwnd' is declared but never used

Warn : x.cpp(40,2):Parameter 'lpszCmdLine' is never used

Warn : x.cpp(40,2):Parameter 'nCmdShow' is never used

Error: x.cpp(54,20):Illegal structure operation

Error: x.cpp(54,41):Undefined symbol 'tmExternalLeading'

Error: x.cpp(56,40):Undefined symbol 'poshorzscoll'

Error: x.cpp(57,40):Undefined symbol 'posvertscoll'

Error: x.cpp(58,16):Call to undefined function 'SetSCrollRange'

Error: x.cpp(135,73):Function call missing )

Error: x.cpp(142,7):Misplaced break

Error: x.cpp(143,5):Case outside of switch

Error: x.cpp(143,17):Expression syntax

Error: x.cpp(145,7):Misplaced break

Error: x.cpp(146,8):Default outside of switch

Warn : x.cpp(148,2):'slength' is declared but never used

Error: x.cpp(149,7):Declaration terminated incorrectly

Error: x.cpp(150,2):Unexpected }

Q:不可能一一为你分析错误,告诉你一些消除错误的原则,你自己来逐一分析,这样你才能学会编程。

首先,用不着见到错误就六神无主。错误信息虽多,但没什么了不起。编译错误就象是拼写检查的结果。

下面,看看有多少条错误信息(Error)和警告(Warn)。当然先分析错误信息,有些警告是由于错误信息产生的。如果你对某条错误信息的含义不了解,可以选择该条错误信息,然后按F1键,在帮助文件中肯定会有更详细的介绍。

绝大多数编译错误实际上都是拼写错误。看看你的程序吧。凡是undefined错误都是拼写错误。象把LoadCursor写成loadCursor,hWnd写成hwnd,别忘了C/C++是区分大小写的!还有把SW_SHOWMAXIMIZED写成SHOW_MAXIMIZED。有时候记忆出了错误,查查手册或帮助就行了。

接下来,要查“(”、“)”、“{”、“}”等各种括号的匹配问题。Function call missing )、Misplaced break、Case outside of switch这些信息都说明你的程序中存在匹配问题。你的程序中有一行 TextOut(hdc,-charwt*(poshorzscroll,charht*(t-posvertscroll),szbuffer,i);} 显然少了一个“)”括号。一般在检查这种错误时,必须找到第一个出现此类错误的地方,修改后一般立即重新

编译,因为一个匹配错误可能引发几十个错误,继续查后面的错误意义不大。

剩下的Cannot convert、Type mismatch错误是数据类型转换错误。这其实不一定是错误,因为C++对参数类型检查的要严格一些,所以有时要尽可能使用强制类型转换来避免这种错误。比如你的

wcAPP.hbrBackground=GetStockObject(WHITE_BRUSH);

导致Cannot convert 'void *' to 'HBRUSH__ *'错误,你可以试着在相关参数前加上(HBRUSH),改成

wcAPP.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);

对于这类转换,不同的C++系统可能不同,所以有的时候不写也可以,但我建议要强制转换,这样麻烦少。同时要注意变量类型是否可以强制转换,比如有的参数为指针类型,要在普通变量前加“&”操作符。这要参考有关函数的帮助。

在创建MFC项目时, 不使用MFC AppWizard向导, 如果没有设置好项目参数, 就会在编译时产生很多连接错误, 如error LNK2001错误, 典型的错误提示有:

libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main

LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16

msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16

nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex

nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex

下面介绍解决的方法:

1. Windows子系统设置错误, 提示:

libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main

Windows项目要使用Windows子系统, 而不是Console, 可以这样设置:

[Project] --> [Settings] --> 选择"Link"属性页,

在Project Options中将/subsystem:console改成/subsystem:windows

2. Console子系统设置错误, 提示:

LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16

控制台项目要使用Console子系统, 而不是Windows, 设置:

[Project] --> [Settings] --> 选择"Link"属性页,

在Project Options中将/subsystem:windows改成/subsystem:console

3. 程序入口设置错误, 提示:

msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16

通常, MFC项目的程序入口函数是WinMain, 如果编译项目的Unicode版本, 程序入口必须改为wWinMainCRTStartup, 所以需要重新设置程序入口:

[Project] --> [Settings] --> 选择"C/C++"属性页,

在Category中选择Output,

再在Entry-point symbol中填入wWinMainCRTStartup, 即可

4. 线程运行时库设置错误, 提示:

nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex

nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex

这是因为MFC要使用多线程时库, 需要更改设置:

[Project] --> [Settings] --> 选择"C/C++"属性页,

在Category中选择Code Generation,

再在Use run-time library中选择Debug Multithreaded或者multithreaded

其中,

Single-Threaded 单线程静态链接库(release版本)

Multithreaded 多线程静态链接库(release版本)

multithreaded DLL 多线程动态链接库(release版本)

Debug Single-Threaded 单线程静态链接库(debug版本)

Debug Multithreaded 多线程静态链接库(debug版本)

Debug Multithreaded DLL 多线程动态链接库(debug版本)

单线程: 不需要多线程调用时, 多用在DOS环境下

多线程: 可以并发运行

静态库: 直接将库与程序Link, 可以脱离MFC库运行

动态库: 需要相应的DLL动态库, 程序才能运行

release版本: 正式发布时使用

debug版本: 调试阶段使用

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值