《Keil最常见编译错误和警告》由会员分享,可在线阅读,更多相关《Keil最常见编译错误和警告(12页珍藏版)》请在金锄头文库上搜索。
1、今天在 EINT 的范例里添加了一个函数,即eint.c 中添加了一个datawrite() 的函数,并在主函数 main.c 中调用,编译便警告warning: #223-D: function “datawrite()“ declared implicitly 很奇怪, 在 eint.c 中也有初始化函数EINTInit() 同样在 main.c 中调用没有问题,问什么偏偏这个不行。但毕竟是个警告,还不是错误,做了个测试IO,while(1) FIO1SET = 119; delaySysTick(10); Data_write(0xff00, 0xff); FIO1CLR = 119;
2、delaySysTick(10); 下载执行后发现,此IO 根本没有输出。看来这个警告还是不能回避的,在网上差了下,有类似问题说是库的原因,具体是什么也没说清楚。于是尝试着一一打开库文件,打开eint.h ,恍然大悟,这里赫然写着extern void EINT0_IRQHandler(void) _irq; extern DWORD EINTInit( void ); 原来在这里将eint.c 中的函数与main.c 相关联,也就是在eint.c 中添加了新函数,还有在这里声明调用才行。eint.h 中,添加extern void Data_write(WORD addr, BYTE dat
3、a); 即可Error: L6200E Error: L6200E: Symbol temp multiply defined (by wenshidu.o and main.o).在编译的时候出现了这个问题,但是检查不出来,希望各位大侠帮帮忙,什么变量你给付了两次值你看看是不是那个外部变量你又给赋值了main.c 申明,其他 .c 文件对应的 .h 文件中用 extern 引用error: #20 error: #20: identifier “TIM2_IRQChannel“ is undefined 谁能说说,哪里错了你的固件库里的库文件没有添加进工程里面,所以出现未定义的情况。TIM2
4、_IRQChannel指定时器 2 的中断通道没有定义,其实在固件库对这些参数都有定义,宏定义代替了一串寄存器地址数据。需要将.C 文件添加到工程文件中warning: #1-D main.c(7): warning: #1-D: last line of file ends without a newline 当使用 keil 编译时,弹出这样的警告信息:main.c(7): warning: #1-D: last line of file ends without a newline 这个是由于在main 函数的 “”后,没有加回车。只要在 main 函数的 “”后加回车键,此警告信息即可
5、消除。error:#65.test_menu.c(27):error:#65:expected a “;“ 分数送你了, 问题在你回答之前已经解决了,头文件里的结构体定义里的最后一行没有加“;“ 如 NB menu.; error: #1113: 折腾了大半天,才搞明白一个空操作的指令先在网上查有的说是_asmNOP; ,从 intrins.h里调用,可犄角旮旯全找了,也没看到什么 intrint.h 的文件。如果直接用,就出现error: #1113: Inline assembler not permitted when generating Thumb code 最后搜索这条错误,知道是
6、因为_asm(“ 指令 “);这种语法是内联汇编(inline assembly)的语法。而RMDK 下,内联汇编仅支持ARM 汇编语言,不支持Thumb 或者 Thumb-2汇编语言;但内嵌汇编器支持Thumb 和 Thumb-2 。_asm 放到一个单独的子函数再被调用就没问题了如下:_asm void nop(void) NOP 然后在之后的C 代码中调用该函数:void main() . nop(); . 最新更新来自 KEIL 官网warning: #223-D .sourceCCxx00_New.C(718): warning: #223-D: function “_NOP_“ d
7、eclared implicitly 在使用的文件中添加extern void _NOP_();既可warning: #1295-D .includeCCxx00_New.h(20): warning: #1295-D: Deprecated declaration CC_XCal - give arg types 没有用形参定时时用 void CC_XCal(void); 即可Error: L6218E: Undefined symbol .Objoutput.axf: Error: L6218E: Undefined symbol FSMC_NORSRAMCmd (referred fro
8、m tft_lcd.o). .Objoutput.axf: Error: L6218E: Undefined symbol FSMC_NORSRAMInit (referred from tft_lcd.o). Target not created 请教高人,我该如何处理。你看看 tft_lcd 里面有没有添加fsmcXXX.h 之类的头文件,这个错误是说你使用的函数没有被定义。一般只要添加相应的头文件即可error: #101: error: #101: has already been declared in the current scope 将#ifndef _STM32F10x_LI
9、B_H #define _STM32F10x_LIB_H #endif调整到最后!error: #247: function “DelayUs“ has already been defined 有一个同名的DelayUs 类已经被定义过了error: #109: expression must have (pointer-to-) function type这个问题就是那19 个 error 中的大部分,意思是表达式需要一个(指针)函数参数,我一开始以为是自己函数声明或者调用上的错误,但是看了下发现并没有错,后来查了好久发现原来是犯了一个很低级的错误:将宏定义和函数名重名了。因为我一开始想的
10、是每一个宏定义对应一个函数名,这样做起来就比较清晰,但是我却很地将函数名每次直接复制到宏名,导致了这种蛋碎的结果。warning: #61-D warning: #68-D: 在 KeilARM 的 LPCARM, 存在 (131) 编译警告问题main.c(174): warning: #61-D: integer operation result is out of range main.c(174): warning: #68-D: integer conversion resulted in a change of sign 由于编译器默认signed int即 32 位有符号整数类型
11、,而 131 实际为 0x80000000, 这样就有可能改写了符号位(最高位 ) 依此类推 ,(230),(329).等都会出现编译警告问题. 解决办法为 : (unsigned int)131),(unsigned int)230),. warning: #1295-D: warning: #1295-D: Deprecated declaration ShowSendTime - give arg types 解决方法:将void ShowSendTime()改为 void ShowSendTime(void) warning: #550-D:warning: #550-D: varia
12、ble “d“ was set but never used 描述 :变量 d定义但从未使用,或者是 ,虽然这个变量你使用了,但编译器认为变量d 所在的语句没有意义 ,编译器把它优化了. 解决 :仔细衡量所定义的变量d 是否有用 ,若是认定变量d 所在语句有意义,那么尝试用volatile 关键字修饰变量d,若是真的没有用,那么删除掉以释放可能的内存. error: #159:.error: #159: declaration is incompatible with previous “wr_lcd“ (declared at line 40) void a(void) / 函数 a 的实体
13、 b(); / 调用函数 b void b(void) / 函数 b 的实体 . 这样如果点编译,就会产生 error: #159 的错误 ,因为当函数a 调用函数 b 时,发现在这之前都没有函数b 的任何声明 . 解决方法 :在函数 a 调用函数 b 之前,对函数 b 进行声明 ,如:void b(void); /对函数 b 进行声明void a(void) / 函数 a 的实体 b(); / 调用函数b void b(void) / 函数 b 的实体 . error: #70:error: #70: incomplete type is not allowed 原来是重复定义了, 包含了两
14、次的psock 的定义,所以才会出现这种情况。因为我发现psock和 pt 是一样定义的,但是pt 是不报错的,所以我就试图删除头文件中include 头文件的那一行,错误消除了,谢谢你了,还是实践出真知啊,有些时候不能死编,要思考,哈哈。keil MDK编译器警告和错误详解(不定期更新 ) 工作后从单片机转成ARM, 刚开始用 ADS1.2 编译器 ,用了一段时间 ,因为我接手的项目的老程序正是用ADS编译的 ,部门也大都在用 .在学单片机的时候用的是keil c51 编译器 ,ads 和这个编译器在易用性上真是无法比较.后来渐渐知道keil 已经被 arm 公司收购 ,现在 keil MD
15、K成为了 arm 官方编译器 ,所以决定重新投奔keil,利用平时的时间 ,将原程序重新用mdk 编译 .mdk 的优点就没必要说了,在这里把平时遇到的编译器给出的警告和错误信息给出详解,希望给初学者一点帮助,发现错误 ,需要补充的欢迎留言. warning: #550-D: 1.warning: #550-D: variable “d“ was set but never used 描述 :变量d定义但从未使用,或者是 ,虽然这个变量你使用了,但编译器认为变量d 所在的语句没有意义,编译器把它优化了 . 解决 :仔细衡量所定义的变量d 是否有用 ,若是认定变量d 所在语句有意义 ,那么尝试用
16、volatile 关键字修饰变量 d,若是真的没有用 ,那么删除掉以释放可能的内存. warning: #1-D: 2.warning: #1-D: last line of file ends without a newline 描述 :文件最后一行不是新的一行.编译器要求程序文件的最后一行必须是空行,想了半天没想通为什么要这样. 解决 :可以不理会 .若是觉得出现警告不爽,那么在出现警告的文件的最后一行敲个回车,空出一行 . warning: #111-D: 3. warning: #111-D: statement is unreachable 描述 :声明不可能到达 .多出现在这种场合: int main(void) . while(1) / 无限循环 ,这在不使用操作系统的程序中最常见 . return 0; /这句声明在正常