VC6中常见错误解决
- 格式:docx
- 大小:16.69 KB
- 文档页数:3
VC中常见的一些编译链接错误的解决VC中常见的一些编译链接错误的解决2010-03-22 15:59问题1:Linking...nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadexnafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadexlibcd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main答VC++默认的工程设置是单线程的,而你使用了多线程,所以要修改设置。
选择菜单“Project|settings”,选择C/C++标签,在CODEGENERATION分类中选择除SINGLE-THREADED的其他选择。
比如可以在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版本: 调试阶段使用问题2fatal error C1010: unexpected end of file while looking for precompiled header directive该如何解如果发生错误的文件是由其他的C代码文件添加进入当前工程而引起的,则Alt+F7进入当前工程的Settings,选择C/C++选项卡,从Category组合框中选中Precompiled Headers,选择Not Using Precompiledheaders。
VisualC++6.0⽆法正常启动提⽰0xc0000142怎么办?vc6.0⽆法执⾏程序解决⽅法VC++(Visual C++) v6.0 简体绿⾊完整版类型:编译⼯具⼤⼩:35.8MB语⾔:简体中⽂时间:2021-07-06查看详情Microsoft Visual C++ 6.0 SP6 中⽂完整安装版(iso⽂件463M)类型:编程⼯具⼤⼩:463MB语⾔:简体中⽂时间:2014-08-14查看详情 vc6.0⽆法正常启动怎么办? 很多⽹友在升级Win10系统后出现vc6.0不能运⾏提⽰“应⽤程序⽆法正常启动0xc0000142”问题。
⽆法运⾏的原因是win10不兼容中⽂版的vc,解决⽅法很简单,直接⽤英⽂版的msdev.exe替换中⽂版的msdev.exe启动程序即可。
vc6.0⽆法执⾏程序解决⽅法: ⾸先下载英⽂版msdev.exe解压出来,然后找你的vc的安装⽬录。
如果你没有安装时没有更改安装路径,那就默认在C盘C:\Program Files (x86)\Microsoft Visual Studio\Common\MSDev98\Bin 这个⽬录下。
如果是绿⾊版,先找到vc总的⽬录,再按照\Common\MSDev98\Bin 这个路径来找。
直接将英⽂版的msdev.exe复制到Bin⽬录下并且覆盖。
有的同学可能是绿⾊版的vc,这种版本的vc可能为了兼容改了⽂件名,不叫msedv.exe,不⽤管,你将英⽂版复制进去之后,每次启动时启动复制进去的英⽂版就是的。
你可以右键发送⼀个快捷⽅式到桌⾯ 回到桌⾯打开刚才发送的快捷⽅式,即可成功启动vc。
写个程序并且编译⼀下,看看有没问题。
有问题可以参考下⾯的注意事项。
注意: 这⾥要注意⼀定要把它放到Bin⽬录下不然启动不了。
有同学没有放到Bin⽬录下,直接打开启动程序,显⽰丢失devshl.dll,就是没好好看步骤,没放到位置。
还有⼈会出现可能编译时会出现error spwaing cl.exe,这个错误⽹上的解决⽅法⼀⼤堆,可以⾃⼰去搜索⼀下。
1.程序开发过程中出现的错误类型我们在进行程序设计时,不可避免地会犯错误。
程序中的错误可以分为三类:编译错误、运行时错误和逻辑错误。
1.1编译错误编译错误(Compile errors)又称为编译时错误(Compiling-time errors): 是由于错误的编码产生的。
例如关键字拼写错误、将中文标点符号当成英文符号使用、遗漏了某些必要的标点符号或者使用了一个没有定义的标识符。
编译错误一般都是语法错误,当编译器对程序进行语法检查时,都能发现这些错误,并能够指出产生错误的位置(标出行号)。
我们可以根据编译出错信息指出的行号找到对应的源代码行改正错误,重新编译源程序。
只有当所有的编译错误被改正后,才能通过编译检查,产生目标代码文件。
改正编译错误的关键是要能正确理解编译器给出的编译错误信息。
VC++环境中的编译、链接错误信息是用英文表示的。
对于英文基础薄弱的读者,可以参考本实验指导书后面的“VC++编译、链接常见错误和警告信息中英文对照”。
通常情况下,一个语法错误可能产生多条编译错误信息,这是由于株连错误造成的,建议读者在处理编译错误时,找到第一个出现错误的位置改正后重新编译。
这样能够避免被株连错误迷惑。
值得指出的是,现在大部分编译器对错误的定位不精确,如果在编译器指出的行没有发现错误,应该向前查找错误。
例如,当提示第10行发生错误时,如果在第10行没有发现错误,请从第10行开始往前查找错误并修改之。
1.2运行时错误运行时错误(Run-time errors)是在程序的运行阶段出现的,当运行环境检测到程序的某些操作无法执行,例如除数为零时,就会出现运行时错误。
当运行环境检测到程序的某些操作是被禁止的,也会产生运行时错误。
例如,访问数组时超越数组的边界,空指针引用(NULL pointer assignment,空指针赋值,即有指针未赋具体地址就使用了)等等。
1.3逻辑错误逻辑错误(Logic errors):当程序没有按照程序员的意图执行时,就表明程序中存在逻辑错误。
Visual C++ 6.0编程环境的使用目录4 编译与链接过程中常见的出错提示 (1)4.1编译、链接问题的解决方法 (1)(1)努力读懂VC报告的错误与警告信息 (1)(2)定位问题所在行 (1)(3)解决问题的方法 (1)(4)避免被VC误导 (1)(5)编译链接问题的解决不代表程序正确 (2)4.2常用单词与术语 (2)4.3常见编译错误信息 (4)(1)error C2001: newline in constant (4)(2)error C2017: illegal escape sequence (4)(3)error C2015: too many characters in constant (4)(4)error C2137: empty character constant (5)(5)error C2018: unknown character '0x##' (5)(6)error C2041: illegal digit '#' for base '8' (5)(7)error C2065: 'xxxx' : undeclared identifier (5)(8)error C2086: 'xxxx' : redefinition (6)(9)error C2374: 'xxxx' : redefinition; multiple initialization (6)(10)error C2143: syntax error : missing ';' before (identifier) 'xxxx'或before 'type' (6)(11)error C4716: 'xxx' : must return a value (7)(12)error C2006: #include expected a filename, found '(' / found 'identifier' / found 'newline' (7)(13) error C2039: 'aver' : is not a member of 'STU' (7)(14)error C2043: illegal break (7)(15)error C2046: illegal case / error C2047: illegal default (8)(16)error C2050: switch expression not integral (8)(17)error C2051: case expression not constant (8)(18)error C2079: 'da' uses undefined struct 'data' (8)(19)error C2081: 'num2' : name in formal parameter list illegal (9)(20)error C2122: 'num2' : prototype parameter in name list illegal (9)(21)error C2082: redefinition of formal parameter 'aver' (9)(22)error C2172: 'fread' : actual parameter is not a pointer : parameter 1 (9)(23)error C2198: 'FindMin' : too few actual parameters (10)(24)error C2087: '<Unknown>' : missing subscript (10)(25)error C2133: 'num' : unknown size (10)(26)error C2106: '=' : left operand must be l-value (10)(27)error C2108: subscript is not of integral type (10)(28)error C2109: subscript requires array or pointer type (10)(29)error C2181: illegal else without matching if (11)(30)error C2296: '%' : illegal, left operand has type 'double ' (11)(31)fatal error C1004: unexpected end of file found (11)(32)fatal error C1021: invalid preprocessor command 'defint'/'hinclude' (11)(33)fatal error C1083: Cannot open include file: 'sdtio.h': No such file or directory (11)(34)error C2220: warning treated as error - no object file generated (11)4.4常见编译警告信息 (12)(1)warning C4129: 'm' : unrecognized character escape sequence (12)(2)warning C4508: 'main' : function should return a value; 'void' return type assumed (12)(3)warning C4098: 'change' : 'void' function returning a value (12)(4)warning C4700: local variable 'xxx' used without having been initialized (12)(5)warning C4013: 'print' undefined; assuming extern returning int (13)(6)warning C4047: '=' : 'int *' differs in levels of indirection from 'int ' (13)(7)warning C4024: 'fun' : different types for formal and actual parameter 2 (13)(8)warning C4133: 'function' : incompatible types - from 'int [128]' to 'char *' (13)(9)warning C4022: 'fread' : pointer mismatch for actual parameter 1 (14)(10)warning C4018: '<' : signed/unsigned mismatch (14)(11) warning C4305: '=' : truncation from 'const double ' to 'float ' (15)(12)warning C4553: '==' : operator has no effect; did you intend '='? (15)(13)warning C4715: 'fun' : not all control paths return a value (15)4.5常见链接错误 (16)(1)error LNK2001: unresolved external symbol _main (16)(2)error LNK2005: _main already defined in xxxx.obj (16)(3)fatal error LNK1168: cannot open Debug/P901.exe for writing (17)4.6T URBO C V2.0编译错误信息的英汉对照表 (17)4 编译与链接过程中常见的出错提示4.1 编译、链接问题的解决方法(1)努力读懂VC报告的错误与警告信息编译、链接过程中,主要由于初学和录入阶段的击键失误,VC经常会提示程序有错(语法和拼写问题,肯定不会指明算法有问题,否则就不用编程了)。
用VC++6.0时点“打开文件”时弹出“ox5003eaed”指令引用的“ox00000000”内存。
该内存不能为“read”2011-07-26 16:44问题:在Visual c + + 中使用键盘快捷键或从"文件"菜单中选择“打开”将产生以下错误:“0x5003eaed指令引用的"0x00000000"内存。
该内存不能为"read"。
要终止程序,请单击"确定"。
要调试程序,请单击"取消"。
” 的一个对话框。
当点击项目——>添加到项目——>文件时,将出现相同错误。
解决:FileTool.exe 是一个示例,用于替换“打开”和“添加到项目”菜单项在 Visual c + + 中使用开发工具 Studio 对象模型。
从 Microsoft 下载中心下载FileTool.exe :/download/vc60ent/s1/6.0/w9xnt4/en-us/filetool.exe自解压 FileTool.exe为FileTool文件夹待用。
为防止文件丢失,可将FileTool文件夹放在Visual c + + 6.0安装文件(:\Program Files\Microsoft Visual Studio)中。
一、首先安装外接程序:1. 运行 Visual c + + 6.0,文件--打开工作空间,打开刚才解压的filetool中的dsw工作空间文件编译,在DBUG文件夹中生成filetool.dll文件2.工具——>定制3.选择“附加项和宏文件”选项卡,单击浏览按钮并找到在第1 步中生成程序FileTool.dll 文件。
二、1. 工具——>定制——>键盘类别——>文件;命令——>FileOpen;编辑器——>主要;当前键——> CTRL + O ,单击“移去”:2. 类别——>工程;命令——>InsertFilesIntoProject。
VC6工程升级VS2013遇到的问题问题1:Building an MFC project for a non-Unicode…Building an MFC project for a non-Unicode character set is deprecated解决方法:用于多字节字符编码(MBCS) 的MFC 库(DLL) 不再包含于Visual Studio 中,但是可用作插件,您可以在任何装有Visual Studio Professional、Visual Studio Premium 或Visual Studio Ultimate 的计算机上下载和安装。
(在Visual Studio 中,必须启用MFC。
)安装需要大约440 MB 磁盘空间,包括英语(美国)和DLL 的本地化版本。
在安装MBCS DLL 后,如果卸载或修复Visual Studio,则还会卸载或修复。
但是,如果只禁用MFC,MBCS DLL 仍会保留在系统上。
如果仅卸载或修复MBCS DLL,将不会修改Visual Studio。
总结下就是安装Multibyte MFC Library for Visual Studio 2013详细信息:/b/vcblog/archive/2013/07/08/mfc-support-for-mbcs-deprecated-in-visual-studio-2013. aspx下载地址:/zh-cn/download/details.aspx?id=40770问题2:warning C4996: 'MBCS…warning C4996: 'MBCS_Support_Deprecated_In_MFC': MBCS support in MFC is deprecated and may be removed in a future version of MFC.解决方法:这个链接/fwlink/p/?LinkId=279048文中提到可以通过将NO_WARN_MBCS_MFC_DEPRECATION 预处理器定义添加到您的项目生成定义消除此警告。
0 引言多年从事高职高专学生的C++面向对象程序设计语言教学工作,在教学中发现,由于高职高专学生基础较为薄弱及课程设置等相关问题,导致绝大部分学生在学习C++程序设计过程中,尤其是使用Microsoft Visual C++ 6.0进行程序设计时,容易出现一些常见易错问题。
C++程序设计一般来说均是高职学生接触的第一门面向对象程序设计语言,其面向对象的编程思想和方法有别于C语言以及学生常规性思维。
本文总结一些常见的初学者容易出现的错误类型,便于感兴趣的初学者借鉴使用,提高大家的学习兴趣和学习效率。
1 易错问题及解决方案1.1 头文件问题使用Microsoft Visual C++ 6.0进行C++语言程序设计不同于C的一大特点之一,C++程序设计一般都要求需要先使用#in-clude命令包含需要使用到的头文件,例如程序需要使用cin及cout输入输出命令,则需要首先包含iostream文件,否则就会编译不成功,会出现cin、cout未定义以及>>、<<类型错误的错误提示。
1.2 名字空间问题类似于头文件问题,进行C++程序编译时,需要将有关的名字空间包含进来。
例如在头文件问题阐述中,为了使用Microsoft Vi-sual C++ 6.0已经定义的输入输出语句cin、cout以及<<、>>,光是包含了头文件iostream是不够的,。
此时一样会出现cin、cout未定义以及>>、<<类型错误的错误提示。
还需要使用using namespace 命令将std名字空间包含进来,因为Microsoft Visual C++ 6.0对于cin、cout以及>>、<<的定义是放在std名字空间里面的。
1.3 多个main函数问题C++程序强调一个工程有且仅有一个主函数。
但是在实际学习和编程中,很多初学者往往习惯性在一个工程下新建多个.cpp文件,且每一个.cpp文件里面都有一个主函数。
VC6.0编译常见错误第一部分编译错误1.error C2001: newline in constant编号:C2001直译:在常量中出现了换行。
错误分析:(1)字符串常量、字符常量中是否有换行。
(2)在这句语句中,某个字符串常量的尾部是否漏掉了双引号。
(3)在这语句中,某个字符创常量中是否出现了双引号字符“"”,但是没有使用转义符“\"”。
(4)在这句语句中,某个字符常量的尾部是否漏掉了单引号。
(5)是否在某句语句的尾部,或语句的中间误输入了一个单引号或双引号。
2.error C2015: too many characters in constant编号:C2015直译:字符常量中的字符太多了。
错误分析:单引号表示字符型常量。
一般的,单引号中必须有,也只能有一个字符(使用转义符时,转义符所表示的字符当作一个字符看待),如果单引号中的字符数多于4个,就会引发这个错误。
另外,如果语句中某个字符常量缺少右边的单引号,也会引发这个错误,例如:if (x == 'x || x == 'y') { … }值得注意的是,如果单引号中的字符数是2-4个,编译不报错,输出结果是这几个字母的ASC码作为一个整数(int,4B)整体看待的数字。
两个单引号之间不加任何内容会引发如下错误:error C2137: empty character constant。
3.error C2018: unknown character '0x##'编号:C2018直译:未知字符…0x##‟。
错误分析:0x##是字符ASC码的16进制表示法。
这里说的未知字符,通常是指全角符号、字母、数字,或者直接输入了汉字。
如果全角字符和汉字用双引号包含起来,则成为字符串常量的一部分,是不会引发这个错误的。
4.error C2041: illegal digit '#' for base '8'编号:C2141直译:在八进制中出现了非法的数字…#‟(这个数字#通常是8或者9)。
错误分析:如果某个数字常量以“0”开头(单纯的数字0除外),那么编译器会认为这是一个8进制数字。
例如:“089”、“078”、“093”都是非法的,而“071”是合法的,等同于是进制中的“57”。
5.error C2065: 'xxxx' : undeclared identifier编号:C2065直译:标识符“xxxx”未定义。
错误分析:首先,解释一下什么是标识符。
标志符是程序中出现的除关键字之外的词,通常由字母、数字和下划线组成,不能以数字开头,不能与关键字重复,并且区分大小写。
变量名、函数名、类名、常量名等等,都是标志符。
所有的标志符都必须先定义,后使用。
标志符有很多种用途,所以错误也有很多种原因。
(1)如果“xxxx”是一个变量名,那么通常是程序员忘记了定义这个变量,或者拼写错误、大小写错误所引起的,所以,首先检查变量名是否正确。
(关联:变量,变量定义)(2)如果“xxxx”是一个函数名,那就怀疑函数名是否没有定义。
可能是拼写错误或大小写错误,当然,也有可能是你所调用的函数根本不存在。
还有一种可能,你写的函数在你调用所在的函数之后,而你有没有在调用之前对函数原形进行申明。
(关联:函数申明与定义,函数原型)(3)如果“xxxx”是一个库函数的函数名,比如“sqrt”、“fabs”,那么看看你在cpp文件已开始是否包含了这些库函数所在的头文件(.h文件)。
例如,使用“sqrt”函数需要头文件math.h。
如果“xxxx”就是“ci n”或“cout”,那么一般是没有包含“iostream.h”。
(关联:#include,cin,cout)(4)如果“xxxx”是一个类名,那么表示这个类没有定义,可能性依然是:根本没有定义这个类,或者拼写错误,或者大小写错误,或者缺少头文件,或者类的使用在申明之前。
(关联:类,类定义)(5)标志符遵循先申明后使用原则。
所以,无论是变量、函数名、类名,都必须先定义,后使用。
如使用在前,申明在后,就会引发这个错误。
(6)C++的作用域也会成为引发这个错误的陷阱。
在花括号之内变量,是不能在这个花括号之外使用的。
类、函数、if、do(while)、for所引起的花括号都遵循这个规则。
(关联:作用域)(7)前面某句语句的错误也可能导致编译器误认为这一句有错。
如果你前面的变量定义语句有错误,编译器在后面的编译中会认为该变量从来没有定义过,以致后面所有使用这个变量的语句都报这个错误。
如果函数申明语句有错误,那么将会引发同样的问题。
6.error C2086: 'xxxx' : redefinition编号:C2374直译:“xxxx”重复申明。
错误分析:变量“xxxx”在同一作用域中定义了多次。
检查“xxxx”的每一次定义,只保留一个,或者更改变量名。
7.error C2374: 'xxxx' : redefinition; multiple initialization编号:C2374直译:“xxxx”重复申明,多次初始化。
错误分析:变量“xxxx”在同一作用域中定义了多次,并且进行了多次初始化。
检查“xxxx”的每一次定义,只保留一个,或者更改变量名。
8.C2143: syntax error : missing ';' before (identifier) 'xxxx'编号:C2143直译:在(标志符)“xxxx”前缺少分号。
错误分析:这是VC6的编译期最常见的误报,当出现这个错误时,往往所指的语句并没有错误,而是它的上一句语句发生了错误。
其实,更合适的做法是编译器报告在上一句语句的尾部缺少分号。
上一句语句的很多种错误都会导致编译器报出这个错误:(1)上一句语句的末尾真的缺少分号。
那么补上就可以了。
(2)上一句语句不完整,或者有明显的语法错误,或者根本不能算上一句语句(有时候是无意中按到键盘所致)。
(3)如果发现发生错误的语句是cpp文件的第一行语句,在本文件中检查没有错误,而且这个文件使用双引号包含了某个头文件,那么检查这个头文件,在这个头文件的尾部可能有错误。
9.error C2137: empty character constant编号:C2137直译:空的字符定义。
错误分析:原因是连用了两个单引号,而中间没有任何字符。
一般的,单引号表示字符型常量,单引号中必须有,也只能有一个字符(使用转义符时,转义符所表示的字符当作一个字符看待)。
两个单引号之间不加任何内容是不允许的。
需要注意的是:如果单引号中的字符数是2-4个,编译不报错,输出结果是这几个字母的ASC码作为一个整数(int,4B)整体看待的数字。
如果单引号中的字符数多于4个,会引发2015错误:error C2015: too many characters in constant。
10.error C2374: 'xxxx' : redefinition; multiple initialization编号:C2374直译:“xxxx”重复申明,多次初始化。
错误分析:变量“xxxx”在同一作用域中定义了多次,并且进行了多次初始化。
检查“xxxx”的每一次定义,只保留一个,或者更改变量名。
第二部分链接错误1.error LNK2001: unresolved external symbol _main编号:LNK2001直译:未解决的外部符号:_main。
错误分析:缺少main函数。
看看main的拼写或大小写是否正确。
2.error LNK2005: _main already defined in xxxx.obj编号:LNK2005直译:_main已经存在于xxxx.obj中了。
错误分析:直接的原因是该程序中有多个(不止一个)main函数。
这是初学C++的低年级同学在初次编程时经常犯的错误。
这个错误通常不是你在同一个文件中包含有两个main函数,而是在一个project(项目)中包含了多个cpp文件,而每个cpp文件中都有一个main函数。
引发这个错误的过程一般是这样的:你写完成了一个C++程序的调试,接着你准备写第二个C++文件,于是你可能通过右上角的关闭按钮关闭了当前的cpp文件字窗口(或者没有关闭,这一操作不影响最后的结果),然后通过菜单或工具栏创建了一个新的cpp文件,在这个新窗口中,程序编写完成,编译,然后就发生了以上的错误。
原因是这样的:你在创建第二个cpp文件时,没有关闭原来的项目,所以你无意中新的cpp文件加入你上一个程序所在的项目。
切换到“File View”视图,展开“Source Files”节点,你就会发现有两个文件。
在编写C++程序时,一定要理解什么是 Workspace、什么是Project。
每一个程序都是一个Project(项目),一个Project可以编译为一个应用程序(*.exe),或者一个动态链接库(*.dll)。
通常,每个Project下面可以包含多个.cpp文件,.h文件,以及其他资源文件。
在这些文件中,只能有一个main 函数。
初学者在写简单程序时,一个Project中往往只会有一个cpp文件。
Workspace(工作区)是Project的集合。
在调试复杂的程序时,一个Workspace可能包含多个Project,但对于初学者的简单的程序,一个Workspace往往只包含一个Project。
当完成一个程序以后,写另一个程序之前,一定要在“File”菜单中选择“Cl ose Workspace”项,已完全关闭前一个项目,才能进行下一个项目。
避免这个错误的另一个方法是每次写完一个C++程序,都把VC6彻底关掉,然后重写打开VC6,写下一个程序。