2022年VC编译常见错误 .pdf
VC 编译常见错误 - - 1、Fatal Error C1010 unexpected end of file while looking for precompiled header directive 这一般是由于使用了参数/Yustdafx.h ,意思是在每个文件中都应该使用#include来包含这个头文件。一般改正,就是在每个。CPP 文件中包含这个文件就可以。2、LNK2001 on _beginthreadex and _endthreadex 这是一个非常常见的链接错误。原因是由于在VC3 。0 以后所有的MFC 类都是线程安全的,在MFC 类库中使用了 Thread Local Storage (TLS)提供预处理的数据。 因此如果程序中包含了stfafx.h 头文件或者使用了, MFC 类库中的类就会使用MSVCRTx0.DLL 来进行链接。改正方法如下:On Visual C 2.x, 5.0, and 6.0: Select the Project menu, and then continue Steps 2 through 5 below. On Visual C 4.x: Select the Build menu. Select the Settings. option. Select the C/C+ tab. Select Code Generation on the Category list box. Finally, make a selection other than Single-Threaded on the Use Run Time Library list box. 如果使用了 Multithreaded using DLL方式还要求在预处理符号中加上_AFXDLL 符号 . 还在 LIBC 。LIB 是 C Runtime的静态链接库。MSVCRTx0.DLL 是 C Runtime的动态链接库。如果程序中包含了任何MFC 代码 ,或者编译使用了/MT 选项 ,都要求使用多线程库。为什么在程序中包含了StdAfx.h 文件也会出现这个连接错误呢?是由于在StdAfx.h 中使用了 MFC类,并且重载了new 等操作符,如果在程序中使用了NEW 等就会出现链接错误。1、Fatal Error C1010 unexpected end of file while looking for precompiled header directive 这一般是由于使用了参数/Yustdafx.h ,意思是在每个文件中都应该使用#include来包含这个头文件。一般改正,就是在每个。CPP 文件中包含这个文件就可以。2、LNK2001 on _beginthreadex and _endthreadex 这是一个非常常见的链接错误。原因是由于在VC3 。0 以后所有的MFC 类都是线程安全的,在MFC 类库中使用了 Thread Local Storage (TLS)提供预处理的数据。 因此如果程序中包含了stfafx.h 头文件或者使用了, MFC 类库中的类就会使用MSVCRTx0.DLL 来进行链接。改正方法如下:On Visual C 2.x, 5.0, and 6.0: Select the Project menu, and then continue Steps 2 through 5 below. On Visual C 4.x: Select the Build menu. Select the Settings. option. Select the C/C+ tab. Select Code Generation on the Category list box. Finally, make a selection other than Single-Threaded on the Use Run Time Library list box. 如果使用了 Multithreaded using DLL方式还要求在预处理符号中加上_AFXDLL 符号 . 还在 LIBC 。LIB 是 C Runtime的静态链接库。MSVCRTx0.DLL 是 C Runtime的动态链接库。如果程序中包含了任何MFC 代码 ,或者编译使用了/MT 选项 ,都要求使用多线程库。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 10 页 - - - - - - - - - 为什么在程序中包含了StdAfx.h 文件也会出现这个连接错误呢?是由于在StdAfx.h 中使用了 MFC类,并且重载了new 等操作符,如果在程序中使用了NEW 等就会出现链接错误。http:/ C+ Error Messages Visual C+ Error Messages This page contains a listing of difficult to diagnose error messages and possible fixes. I havent taught a programming class that uses Visual C+ in several years so this list is probably out of date by now. It was valid for Microsoft Visual C+ version 6.0 service pack 3. C1001: INTERNAL COMPILER ERROR (compiler file msc1.cpp, line 1786) Please choose the Technical Support command on the Visual C+ Help menu, or open the Technical Support help file for more information This error results from leaving off the parentheses immediately following the function name in a function header. To correct the error simply add () to the end of the function name. C1010: unexpected end of file while looking for precompiled header directive If your project is an MFC AppWizard created project then this error results from not #including StdAfx.h as the first i nclude statement (before any other i ncludes, data declarations, or executable program code). C1083: Cannot open precompiled header file: Debug/.pch: No such file or directory This error results from a missing file - the compiled version of StdAfx.cpp. Visual C+ does a poor job of keeping track of this file and frequently forgets how to build it. This problem often occurs after restoring a saved workspace from diskette without the Debug directory. To fix the error select StdAfx.cpp from the workspace file list them choose Compile from the Build menu. If that doesnt work the go to Project - Settings, select the C/C+ tab, and click the radio button labeled Create Precompiled Headers. C2001: newline in constant This error is usually caused by a string or character constant that is missing its closing or symbol. C2065: : undeclared identifier If this error occurs in one of your member functions then it is generally the result of forgetting the class scope operator in front of the function name in your .cpp file. C2143: syntax error : missing ; before PCH creation point Check each of the i nclude files to ensure that the closing brace of each class declaration is followed by a semicolon. C2143: syntax error : missing ; before * If this error is followed by two C2501 errors then the problem is an undeclared class name within a pointer declaration. For example, the declaration: CClass *pObject; will generate the above error message followed by a C2501 error message for CClass and another C2501 message for pObject. The problem is that the compiler isnt recognizing CClass as a valid class/type name. To correct the problem add a i nclude of the file containing the declaration of CClass (e.g., i nclude CClass.h) C2447: missing function header (old-style formal list?) This error usually results from a missing or use of a ; instead of a following the parameter list of a function header. 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 10 页 - - - - - - - - - C2511: : overloaded member function not found in This error results from a mismatch in the parameter list of a member function declaration (.h file) and definition (.ccp file). Check the forward declaration of the function in the .h file and its definition in the .cpp file and ensure that the number of parameters and the type of each parameter match exactly.C2512: : no appropriate default constructor available This error usually occurs when you implement the constructor function of a derived class and forget to include parameter passing to the base class constructor function. For example assume that CDerived is derived from CBase and that the CBase constructor function requires one parameter (e.g., int A). If you define the CDerived constructor function as: CDerived:CDerived(int A, int B) . the compiler will issue the above error message on the line containing the function header of CDerived:CDerived() because you havent provided instructions for routing the parameter A to CBase:CBase(). Because you didnt provide instructions the compiler assumes that CBase:CBase() requires no arguments and it complains because no version of CBase:CBase() has been defined that accepts zero arguments. If you intended to provide a version of CBase:CBase() that requires no arguments then the error message indicates that you forgot to declare that function in your base class declaration (e.g., in CBase.h). If CBase:CBase() does require one or more arguments then you must correct the problem by including explicit instructions for passing parameters from the derived class constructor function to the base class constructor function. The correction for the example above is: CDerived:CDerived(int A, int B) : CBase(A) . C2556: : overloaded functions only differ by return typeC2371: : redefinition; different basic types These errors usually result from a mismatch of function type between a .h and .cpp file. Check the forward declaration of the function in the .h file and its definition in the .cpp file and make the function return type identical in both files. C2601: : local function definitions are illegal This error results from defining one function inside the body of another function. It usually means that you omitted one or more symbols in the function just before the function named in the error message. C2653: : is not a class or namespace name This error usually results from not having i nclude StdAfx.h as the first i nclude statement in your class.cpp file. It can also occur if your class definition is in a .h file and you forget to i nclude that .h file in another file that refers to the class name. C2661: : : no overloaded function takes n parameters This error indicates a mismatch between the parameters used in a function call (e.g., from main.cpp) and the declaration of the function. The function call is passing n parameters and there is no function declaration that uses that number of parameters. LNK1104: Cannot open file nafxcwd.lib This error sometimes occurs when a project uses a class from the MFC but the project settings dont explicitly tell the link editor to look in the MFC libraries. Go to Project - Settings (Build - Settings in Visual C+ 4.0). On the General tab check the box that says Use MFC in a Shared DLL. LNK1168: cannot open Debug.exe for writing 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 10 页 - - - - - - - - - This error occurs when the link editor attempts to write to a .exe file that is currently in use. The .exe file of an executing program is write protected until the program is terminated. Look at the status bar at the bottom of your screen and find the icon representing your executable application. Open the application and exit from it. Then select Build. LNK2001: unresolved external symbol _endthreadex LNK2001: unresolved external symbol _beginthreadex These errors result from using an MFC object or function without telling the link editor to search the MFC libraries. Go to Project - Settings (Build - Settings in Visual C+ 4.0). On the General tab check the box that says Use MFC in a Shared DLL. LNK2001: unresolved external symbol _main Your project doesnt contain a function called main(). The error usually results from forgeting to add main.cpp to the project workspace. .obj : error LNK2001: unresolved external symbol public: void _thiscall :() This a generic form of a LNK2001 error where .obj can be any object file in your project and :() can be any function in any class. Substitute the specific , , , and in your message into the instructions below to diagnose and correct the problem. An LNK2001 error means that the link editor is looking for a compiled function and cant find it. The call to the missing function is somewhere in .cpp. Unfortunately, double-clicking on the error message wont take you to the point in where the function is called but you can search for it with Find or Find In Files. The function the link editor cant find is a member of , its name is , and its return type is . There are two common reasons for a LNK2001 error: The call in .cpp doesnt match the function prototype in .h and/or the implementation in .cpp. The mismatch may be in the function name, return type, or number and/or type of parameters. Correction strategies include: Check that the function name is spelled the same (case sensitive) in all three files (File.cpp, Class.h, and Class.cpp). Check that the function is actually declared and defined within - perhaps you defined it as a member of a different class or perhaps you tried to call the function (in .cpp) using an object or object pointer of a different class. Check that the number and type of parameters in the function implementation (in .cpp) matches the number and type of parameters declared in the function declaration in .h. Check that the number and type of parameters in the function call (in .cpp) matches the number and type of parameters declared in the function header in .cpp. The function was never declared or was declared but never defined. To see if either is the case go to the ClassView window of the Workspace view. Click the + next to and find in the list of member functions. If is NOT in the list then it was never declared or defined - add a declaration to the class declaraion in .h and implement the function in .cpp. If is in the list then right click on it and select Go To Definition from the pop-up menu. If you 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 10 页 - - - - - - - - - get the error message Cannot find definition (implementation) of this function then the function was declared but never defined (implemented). Implement the function to .cpp. LNK2005: already defined in .lib(.obj) This error usually results from including a source code file multiple times. If you recognize any of the names in the message then it probably results from multiple inclusion of one of your own header files. Check to be sure that youve used #ifndef/#define/#endif properly your header files. If you dont recognize the name then its probably multiple inclusion of a system file (e.g., afxwin.h). Make sure that you havent explicitly included something in main.cpp that is already included in one of your own header files. Also check that you havent i ncluded a .cpp file where you should have i ncluded a .h file. http:/ 者: happyparrot 出处:urlhttp:/ 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 directiveQ: 两个办法:-肯定是一个新添加的类的.cpp 文件开头没包含stdafx.h ,在该文件最前面加上即可-有时可以使用右键点击项目工程中的该cpp 文件,选择setting ,在 c/c+栏,选择PreCompiled headers ,然后设置第一选项,选择不使用预编译头,解决这个问题。3.在编译时产生的下面的代码,那么下面的代码中的括号内的数字代表什么意思,还有 error 后的数字呢?Compiling. CalWnd.cpp E:StudyVCCalendarAppCalWnd.cpp(1092) : error C2065: TTS_BALLOON : undeclared identifier E:StudyVCCalendarAppCalWnd.cpp(1092) : error C2059: syntax error : ) E:StudyVCCalendarAppCalWnd.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:fuanDebugfuan.exe 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 10 页 - - - - - - - - - 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 _ma