第一篇:最常见的20种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)”
连接时发现没有实现的外部符号(变量、函数等)。
function call missing argument list 调用函数的时候没有给参数。
member function definition looks like a ctor, but name does not match enclosing class 成员函数声明了但没有使用
unexpected end of file while looking for precompiled header directive 在寻找预编译头文件时文件意外结束,编译不正常终止可能造成这种情况
第二篇:常见错误信息
Keil C 编译器常见警告与错误信息的解决方法
1)如果两个或更多c文件都需要使用某非bit型变量,那么声明是应将相应存储类型同时注明,即如果定义“uchar idata cntembuf;”,那么应声明为“extern uchar idata cntembuf;”或者“extern idata cntembuf;”;
2)如果是bit型变量,则数据类型“bit”必须注明,而存储类型可以省略;
LN认为,keil里之所以将bit变量和其他类型变量分开处理,是keil面向的处理器都是51内核的,而51内核bit变量只存在于特殊功能寄存器和内存的位寻址区(bdata区),而特殊功能寄存器中的位变量若在两个以上文件中使用各各文件都只能用类似于sbit abcd = P1^6;的形式进行声明,并且keil不检测abcd这个位变量在不同文件中是否代替相同位(例如,可以在另一个c文件中声明为:sbit abcd = P0^5;等),这样一来,用extern声明的bit变量就只有在bdata区了,所以,允许在在一个c文件中定义位变量后,在其它c文件中省略“bdata”这个存储类型;
而非bit型变量则可以在特殊功能寄存器,内存,外存,所以声明时要使存储类型与定义时的存储类型相同(也可以在定义和声明时都不规定存储类型,而又编译器根据编译模式自动分配)。
1.Warning 280:‟i‟:unreferenced local variable
说明局部变量i 在函数中未作任何的存取操作解决方法消除函数中i 变量的宣告Warning 206:‟Music3‟:missing function-prototype
说明Music3()函数未作宣告或未作外部宣告所以无法给其他函数调用
解决方法将void Music3(void)写在程序的最前端作宣告如果是其他文件的函数则要写成extern void Music3(void),即作外部宣告。Compling :C:8051MANN.C
Error:318:can‟t open file „beep.h‟
说明在编译C:8051MANN.C 程序过程中由于main.c 用了指令#i nclude “beep.h”,但却找不到所致解决方法编写一个beep.h 的包含档并存入到c:8051 的工作目录中Compling:C:8051LED.C
Error 237:‟LedOn‟:function already has a body
说明LedOn()函数名称重复定义即有两个以上一样的函数名称
解决方法修正其中的一个函数名称使得函数名称都是独立的***WARNING 16:UNCALLED SEGMENT,IGNORED FOR OVERLAY PROCESSSEGMENT: ?PR?_DELAYX1MS?DELAY
说明DelayX1ms()函数未被其它函数调用也会占用程序记忆体空间解决方法去掉DelayX1ms()函数或利用条件编译#if …..#endif,可保留该函数并不编译***WARNING 6 :XDATA SPACE MEMORY OVERLAP
FROM : 0025H
TO: 0025H
说明外部资料ROM 的0025H 重复定义地址
解决方法外部资料ROM 的定义如下Pdata unsigned char XFR_ADC _at_0x25 其中XFR_ADC 变量的名称为0x25,请检查是否有其它的变量名称也是定义在0x25 处并修正它7 WARNING 206:‟DelayX1ms‟: missing function-prototype
C:8051INPUT.C
Error 267 :‟DelayX1ms „:requires ANSI-style prototype C:8051INPUT.C
说明程序中有调用DelayX1ms 函数但该函数没定义即未编写程序内容或函数已定义但未作声明。
解决方法:编写DelayX1ms 的内容,编写完后也要作声明或作外部声明可在delay.h 的包含档声明成外部以便其它函数调用。***WARNING 1:UNRESOLVED EXTERNAL SYMBOL
SYMBOL:MUSIC3
MODULE:C:8051MUSIC.OBJ(MUSIC)
***WARNING 2:REFERENCE MADE TO UNRESOLVED EXTERNAL
SYMBOL:MUSIC3
MODULE:C:8051MUSIC.OBJ(MUSIC)
ADDRESS:0018H
说明程序中有调用MUSIC 函数但未将该函数的包含文档C 加入到工程文档Prj 作编译和连接。
解决方法:设MUSIC3 函数在MUSIC.C 里。将MUSIC C 添加到工程文件中去9 ***ERROR 107:ADDESS SPACE OVERFLOW
SPACE: DATA
SEGMENT: _DATA_GOUP_
LENGTH: 0018H
***ERROR 118: REFERENCE MADE TO ERRONEOUS EXTERNAL
SYMBOL: VOLUME
MODULE: C:8051OSDM.OBJ(OSDM)
ADDRESS: 4036H
说明data 存储空间的地址范围为0~0x7f,当公用变量数目和函数里的局部变量如果存储模式设为SMALL 则局部变量先使用工作寄存器R2~R7 作暂存当存储器不够用时则会以data 型别的空间作暂存的个数超过0x7f 时就会出现地址不够的现象。
解决方法:将以data 型别定义的公共变量修改为idata 型别的定义说明定义了全局变量而没有外部External声明:reference made to erroneous externalRam空间不足:public refers to ignore segment
外部变量:定义处不用加External,声明处要加External
将以data 型别定义的公共变量修改为idata 型别的定义*** ERROR L118: REFERENCE MADE TO ERRONEOUS EXTERNAL
定义了某某函数或全部变量在不同文件里面想调用它,却在包含头文件里面少了extern语句,或只有主程序和包含头文件没有(EXTERN......定义语句(函数)).如果调试时有些if结构里的语句符合条件没有执行,或者某些语句不符合条件也被执行,那是因为if和else里有相同的语句,编译的时候作优化处理了。WARNING 15(MULTIPLE CALL TO SEGMENT)症状
我添加了一个中断处理程序(ISR)到我的项目中,然而我却得到了如下的警告: ***WARNING L15:MULTIPLE CALL TO SEGMENT
SEGMENT:?PR?_WRITE_GMVLX1_REG?D_GMVLX1
CALLER1:?PR?VSYNC_INTERRUPT?MAIN
CALLER2:?C_C51STARTUP
***WARNING L15:MULTIPLE CALL TO SEGMENT
SEGMENT:?PR?_SPI_SEND_WORD?D_SPI
CALLER1:?PR?VSYNC_INTERRUPT?MAIN
CALLER2:?C_C51STARTUP
***WARNING L15:MULTIPLE CALL TO SEGMENT
SEGMENT:?PR?SPI_RECEIVE_WORD?D_SPI
CALLER1:?PR?VSYNC_INTERRUPT?MAIN
CALLER2:?C_C51STARTUP
上面这些都是什么?我该如何解决这个问题呢?
原因
Warning 15向我们表明了linker发现了一个函数,这个函数不仅在main code里被调用了,而且在ISR(或者被ISR调用的函数中)被调用了。或者是被同时被多个ISR同时调用了。这样会产生一个问题,就是在此函数不是一个可重入函数,而当此函数已经在执行时它可能被另一个ISR所调用。这样就会导致结果是可变的而且很可能会导致一些参数的错误。另一个问题就是本地变量和参数所使用的内存可能被其他函数的内存覆盖。如果函数是由中断所调用的,则此函数的内存就会被使用。这会引起其它函数的内存错误。
举例来说,对于你的第一个警告,WRITE_GMVLX1_REG是会被多个root所调用。其被定义在D_GMVLX1.C或者D_GMVLX1.A51中。他不仅会被ISR(或者被ISR调用的函数)而且也会被MAIN.C中的VSYNC_INTERRUPT函数所调用。
解决方法
有几种方法去解决这个问题
如果你100%确认这个函数的两个副本都不会同时执行(如果此函数是被main调用并且中断是未被使能的)并且此函数没有使用内存(只使用的寄存器),那么你就可以忽略此警告。如果此函数使用了内存,你就要使用OVERLAY directive来将此函数从覆盖分析(overlay anaysis)中移除。举例如下:
OVERLAY(?PR?_WRITE_GMVLX1_REG?D_GMVLX1!*)
如上语句能阻止被此函数使用的内存遭到覆盖。如果这个函数调用了你程序中其他的在别处的函数,那么你可能需要将这些函数也排除在覆盖分析之外。
如果当此函数在执行时可以被调用,那么事情就会变得比较的复杂。你可能需要:
无论何时当从main中调用此函数时,需要关闭中断。你可能需要对被调用的函数使用#pragma disable。你也必须使用OVERLAY directive将此函数从overlay analysis中移除。为此函数创建两个副本。一个给main,一个给ISR。
使此函数可重入。举例如下:
void myfunc(void)reentrant {
}
上面的定义会产生一个用来存储参数和本地变量的可重入的栈。如果使用了这种方法那么这个可重入的栈必须在STARTUP.A51中配置。这样会花费更多的RAM并且会减缓可冲入函数的执行
第三篇:中常见的一些错误信息
汇编中常见的一些错误信息
ml.exe错误信息:
FATAL严重错误
cannot open file不能打开文件
I/O error closing fileI/O错误 正在关闭文件
I/O error writing fileI/O错误 正在写文件
I/O error reading fileI/O错误 正在读取文件
out of memory缺少内存
assembler limit : macro parameter name table full汇编限制:宏参数名表已满 invalid command-line option无效命令行参数
nesting level too deep嵌套过深
unmatched macro nesting不正确的宏嵌套
line too long行太长
unmatched block nesting不正确的区、段嵌套
directive must be in control block指令必须在控制段
error count exceeds 100;stopping assembly错误数超过100,停止汇编 invalid numerical command-line argument无效命令行参数
too many arguments太多参数、定义、冲突
statement too complex声明太复杂
Internal Assembler Error内部汇编错误
missing source filename找不到源文件名
COFF error writing fileCOFF错误,正在写文件
invalid debug and browser data;file exceeds line limit不能排除故障和浏览数据;文件超过行限制
cannot find link.exe找不到连接程序
cannot find cvpack.exe找不到cvpack.exe
SEVERE严重的错误
memory operand not allowed in context内存操作数无法载入上下文环境 immediate operand not allowed当前操作数无法载入
cannot have more than one ELSE clause per IF blockIF段只能有一个ELSE从句 extra characters after statement附加的字符在声明之后
symbol type conflict符号类型冲突
symbol redefinition符号已经定义
undefined symbol符号没有定义
non-benign record redefinition没有利于记录的定义
syntax error语法错误
syntax error in expression表达式存在语法错误
invalid type expression无效的类型表达式
distance invalid for word size of current segment当前区、段的大小命令无效
PROC, MACRO, or macro repeat directive must precede LOCALPROC, MACRO, 或 macro repeat指令必须在LOCAL之前
.MODEL must precede this directive.MODEL必须在指令之前
cannot define as public or external不能定义为公有或外部的segment attributes cannot change区、段属性不能更换
expression expected预期表达式
operator expected预期操作数
invalid use of external symbol使用了无效的外部符号
operand must be RECORD type or field操作数必须是RECORD类型或域
identifier not a record没有记录标示符
record constants may not span line breaks连续记录不能超过行间隔
instruction operands must be the same size命令操作数必须是一样的长度
instruction operand must have size命令操作数必须有长度
invalid operand size for instruction操作数长度对于指令无效
operands must be in same segment操作数必须在相同的段
constant expected连续预期
operand must be a memory expression操作数必须是一个内存表达式
expression must be a code address表达式必须是一个代码地址
multiple base registers not allowed不允许多重基础寄存器
multiple index registers not allowed不允许多重标志寄存器
must be index or base register必须是基础或标志寄存器
invalid use of register使用的寄存器无效
invalid INVOKE argument无效的INVOKE符号
must be in segment block必须在区、段、块中
DUP too complexDUP太复杂
too many initial values for structure太多结构的基础资料
statement not allowed inside structure definition声明不允许在结构里面
missing operand for macro operator找不到宏的操作数
line too long
segment register not allowed in context上下文不允许有寄存器
string or text literal too long文本或字符串太长
statement too complex声明太复杂
identifier too long标识符太长
invalid character in file文件里有无效字符
missing angle bracket or brace in literal语句里找不到同样的括弧或框架
missing single or double quotation mark in string找不到单引号或双引号
empty(null)string没有字符串
nondigit in number没有总数
syntax error in floating-point constant不确定的指向中有语法错误
real or BCD number not allowed不允许real或BCD编码
text item required必须的文本项
forced error强制错误
forced error : value equal to 0标准等于零
forced error : value not equal to 0标准不等于零
forced error : symbol not defined符号没有定义
forced error : symbol defined符号已定义
forced error : string blank字符串是空的forced error : string not blank字符串不是空的forced error : strings equal字符串是相同的forced error : strings not equal字符串不是相同的[ELSE]IF2/.ERR2 not allowed : single-pass assembler[ELSE]IF2/.ERR2不允许单独汇编 expression too complex for.UNTILCXZ.UNTILCXZ表达式太复杂
can ALIGN only to power of 2仅能对齐到2的幂
structure alignment must be 1, 2, 4, 8, or 16结构对齐必须是1,2,4,8或16 expected预定义
incompatible CPU mode and segment size不匹配的CPU模式和段尺寸
LOCK must be followed by a memory operationLOCK指令必须跟在内存操作之后 instruction prefix not allowed不允许的命令前缀
no operands allowed for this instruction指令没有操作数
invalid instruction operands无效的指令操作数
initializer magnitude too large for specified size初始指定尺寸太大
cannot access symbol in given segment or group在特定的段或类不能存取符号
operands have different frames操作数存在不同的结构
cannot access label through segment registers在段寄存器中不能存取标记
jump destination too far跳转目标太远
jump destination must specify a label跳转目标必须指定一个标记
instruction does not allow NEAR indirect addressing指令不允许近间接寻址
instruction does not allow FAR indirect addressing指令不允许远间接寻址
instruction does not allow FAR direct addressing指令不允许远直接寻址
jump distance not possible in current CPU mode跳转距离不适合当前CPU模式
missing operand after unary operator一元运算符之后找不到操作数
cannot mix 16-and 32-bit registers不能结合16位和32位寄存器
invalid scale value无效范围标准
constant value too large连续标准太多
instruction or register not accepted in current CPU mode当前CPU模式不认可的指令或寄存器 reserved word expected预期的保留字
instruction form requires 80386/486指令需要80386/486指示
END directive required at end of fileEND指令必须在文件结尾
too many bits in RECORD太多位在记录里
positive value expected预期的明确的标准
index value past end of string索引标准在字符串结尾之后
count must be positive or zero计数必须是零或明确的count value too large计数标准太多
operand must be relocatable操作数必须是转移表
constant or relocatable label expected预期的转移表或连续的segment, group, or segment register expected预期的段,类型或段寄存器 segment expected预期的区段
invalid operand for OFFSETOFFSET操作数无效
invalid use of external absolute由于完全外部的使用无效
segment or group not allowed区段或类型不允许
cannot add two relocatable labels不能增加双重转移表标记
cannot add memory expression and code label不能增加内存表达式和代码标记
第四篇:Visual_C++_6.0常见语法错误信息
Visual C++ 6.0常见的语法错误信息
1、error C2018: unknown character '0xa1'
不认识的字符'0xa1'。(一般是汉字或中文标点符号)
2、error C2065: 'I„„' : undeclared identifier“I„„”:未声明过的标识符。
3、error C2146: syntax error : missing ';'
语法错误:丢了“;”。
4、error C2146: syntax error : missing ')'
语法错误:丢了“)”。
5、fatal error C1004: unexpected end of file found 语法错误:丢了“}”。
6、error C2057: expected constant expression
希望是常量表达式。(一般出现在switch语句的case分支中)
7、error C2196: case value 'xx' already used
值xx已经用过。(一般出现在switch语句的case分支中)
8、error C2181: illegal else without matching if语法错误:if缺少判断表达式。
第五篇:VC6.0编译常见错误的详解及其错误分析(范文)
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”就是“cin”或“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
编号:C237
4直译:“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”菜单中选择“Close Workspace”项,已完全关闭前一个项目,才能进行下一个项目。避免这个错误的另一个方法是每次写完一个C++程序,都把VC6彻底关掉,然后重写打开VC6,写下一个程序。