窗体底端
关于VC编译(biānyì)错误fatal error C1083的解决办法
这时因为该模块没有包括(bāokuò)预编译头文件“stdafx.h”的缘故(yuángù)。
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,
最简单的办法就是选中第一个选项“",这样就根本不用预编译头也不去寻pc件,
就不会出错了,但是这样做的后果是每次编译、连接都化更多的时间。
第二个选项”Automatic ...",然后在“Through header”力填上stdafx.h,这样
如果没有pc件系统会自动生成一个pch,如果有的话就使用这个pch,这个选项是比较“
智能”的。
第三个选项是强行创建一个pc件,第四个选项是直接使用pc件。当然“Through
最简单的办法就是选中第一个选项“",这样就根本不用预编译头也不去寻pc件,
就不会出错了,但是这样做的后果是每次编译、连接都化更多的时间。
第二个选项”Automatic ...",然后在“Through header”力填上stdafx.h,这样
如果没有pc件系统会自动生成一个pch,如果有的话就使用这个pch,这个选项是比较“
智能”的。
第三个选项是强行创建一个pc件,第四个选项是直接使用pc件。当然“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->->MSVCRT.LIB
解决办法:
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->->MSVCRT.LIB
以下转其他,
1.
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,然后设置第一选项,选择不使用预编译头,解决这个问题。
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后的数字呢?
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
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
Q:括号中的数字是出错的代码行的行号。例如错误中的第1行表示CalWnd.cpp的1092行出现了错误。如果想快速到这行,可以在错误信息行上双击鼠标,这时VC++会自动打开CalWnd.cpp文件并定位到这行。
Error后面的数字表示错误代号。错误代号分为两类:C开头的是编译错误,即你的代码存在语法错误,你需要修改代码;LNK开头的是链接错误,通常你的代码并没有语法错误,可能是配置错误引起的,但有时LNK可能是由于拼写错误引起的。在错误信息行上按F1键,VC++会打开MSDN帮助并显示关于该错误信息的一个简单的解释,你可以根据该解释来知道到底是什么意思。
4.vc编译的时候可以设置两个版本:debug和release,debug版本在运行的时候点击帮助菜单
Error
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\
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).
Debug Assertion Failed:
Program :C:\fuan\
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-------
Q:
在MFC中,大量使用了ASSERT宏,这些宏通常可以来纠正一些错误,如还没有初始化指针就使用等。你所遇到的信息就是ASSERT宏报告的错误。通常你要检查一下是否存在错误。在Release方法下,ASSERT宏不会执行,所以也没有错误信息。不过,MFC中的ASSERT宏有时管得有点宽,如果确认没有错误,也可以不理会它。
5. 在win2000上能编译的程序到了win98就不能编译了。
没有出错信息,一编译就停在
--Configuration: Monitor - Win32 Release-------
Copying
是不是跟*.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
: 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(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
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);} 显然少了一个“)”括号。一般在检查这种错误时,必须到第一个出现此类错误的地方,修改后一般立即重新
编译,因为一个匹配错误可能引发几十个错误,继续查后面的错误意义不大。
绝大多数编译错误实际上都是拼写错误。看看你的程序吧。凡是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++系统可能不同,所以有的时候不写也可以,但我建议要强制转换,这样麻烦少。同时要注意变量类型是否可以强制转换,比如有的参数为指针类型,要在普通变量前加“&”操作符。这要参考有关函数的帮助。
wcAPP.hbrBackground=GetStockObject(WHITE_BRUSH);
导致Cannot convert 'void *' to 'HBRUSH__ *'错误,你可以试着在相关参数前加上(HBRUSH),改成
wcAPP.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
对于这类转换,不同的C++系统可能不同,所以有的时候不写也可以,但我建议要强制转换,这样麻烦少。同时要注意变量类型是否可以强制转换,比如有的参数为指针类型,要在普通变量前加“&”操作符。这要参考有关函数的帮助。
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'
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 for writing
连接错误:不能打开P1.exe文件,以改写内容。(一般是P1.Exe还在运行,未关闭)
20、error LNK2001: unresolved external symbol "public: virtual _ _thiscall C……::~C……(void)"
连接时发现没有实现的外部符号(变量、函数等)。
========================================================================================[/ft]
在创建MFC项目时, 不使用MFC AppWizard向导, 如果没有设置好项目参数, 就会在编译时产
19、LINK : fatal error LNK1168: cannot open for writing
连接错误:不能打开P1.exe文件,以改写内容。(一般是P1.Exe还在运行,未关闭)
20、error LNK2001: unresolved external symbol "public: virtual _ _thiscall C……::~C……(void)"
连接时发现没有实现的外部符号(变量、函数等)。
========================================================================================[/ft]
在创建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
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,
在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
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 <
多线程: 可以并发运行
静态库: 直接将库与程序Link, 可以脱离MFC库运行
动态库: 需要相应的DLL动态库, 程序才能运行
release版本: 正式发布时使用
debug <
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论