你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

Keil编译常见问题(二)

[复制链接]
kqh1120 发布时间:2015-1-28 10:27

+ q5 |, v4 }4 q4 {& w4 s' \  a5 XKeil编译常见问题(一)
: v' e. ~+ m; b% ]4 p# Q- `# a
  L7 N* @# _! {: f$ S3 _* awarning:  #1295-D:
warning:  #1295-D: Deprecated declaration ShowSendTime - give arg types: [1 A: A# _$ H: g  N
解决方法:将void ShowSendTime()改为void ShowSendTime(void)
2 Q+ ]8 T3 p, ?8 k0 i
2 l9 p% w" {7 W% a/ \; j/ cwarning:  #550-D:warning:  #550-D: variable "d" was set but never used
; b, u$ g+ {. [7 [# E5 U  w
描述:变量'd'定义但从未使用,或者是,虽然这个变量你使用了,但编译器认为变量d所在的语句没有意义,编译器把它优化了.
7 o* ]$ ^; V2 ~+ d; J# A9 K. [
解决:仔细衡量所定义的变量d是否有用,若是认定变量d所在语句有意义,那么尝试用volatile关键字修饰变量d,若是真的没有用,那么删除掉以释放可能的内存.
- B, i' I% ]. H) e$ T9 c
) U7 K# b4 M, {3 v( Oerror:  #159:你的固件库里的库文件没有添加进工程里面,所以出现未定义的情况。  E( P2 n- f3 d, E& O( i! @% X0 u
TIM2_IRQChannel指定时器2的中断通道没有定义,其实在固件库对这些参数都有定义,宏定义代替了一串寄存器地址数据。需要将.C文件添加到工程文件中解决方法:在函数a调用函数b之前,对函数b进行声明,如:$ E" g$ |5 |; M$ H
void b(void); //对函数b进行声明( t2 R) ~: }8 i) o
void a(void) //函数a的实体& |' N; G4 g' D" y! X
{
! ]& G8 R1 N$ U, E- R
      b(); //调用函数b
$ a( M/ h# e, `
}
9 |' }% N3 m: {# q/ }+ k$ i8 q3 svoid b(void) //函数b的实体
- Z) d8 g* ?7 }* t9 v
{
; t! p0 N: D* b: P+ G
     ...
% T3 B+ ]7 r2 g9 j% d1 k
}
6 `5 {8 ?3 F8 }9 U' Z1 uerror:  #70:error:  #70: incomplete type is not allowed
& J! L9 e; {# G4 T' J4 U0 o你的固件库里的库文件没有添加进工程里面,所以出现未定义的情况。; |" f/ b2 U7 U" O; l" Q- L
TIM2_IRQChannel指定时器2的中断通道没有定义,其实在固件库对这些参数都有定义,宏定义代替了一串寄存器地址数据。需要将.C文件添加到工程文件中7 D3 a/ o' B/ k- c9 Y
, N# x; ]) B& W& X* X  N2 h

2 O' y) ?" D, [* r# m2 wwarning: #550-D:
1.warning: #550-D: variable "d" was set but never used, E, v$ q* y# ^7 w- A1 s6 q; ]+ S& M! v
描述:变量'd'定义但从未使用,或者是,虽然这个变量你使用了,但编译器认为变量d所在的语句没有意义,编译器把它优化了.
7 }# S9 ~  Y: {6 ^解决:仔细衡量所定义的变量d是否有用,若是认定变量d所在语句有意义,那么尝试用volatile关键字修饰变量d,若是真的没有用,那么删除掉以释放可能的内存.! A1 m' Y9 A! ~  q2 k0 Y6 y

" W5 L# T3 i3 ywarning: #1-D:2.warning: #1-D: last line of file ends without a newline. O% Y  e2 K9 m0 b
描述:文件最后一行不是新的一行.编译器要求程序文件的最后一行必须是空行,想了半天没想通为什么要这样.7 `2 t/ U* {7 E' k7 s4 y& L
解决:可以不理会.若是觉得出现警告不爽,那么在出现警告的文件的最后一行敲个回车,空出一行.
0 g1 s7 H  d8 ~  G( {1 m  Y

. z& _% Q/ |3 @0 ]- m- f* ?& F% @warning: #111-D:3. warning: #111-D: statement is unreachable
$ _7 F# y5 H: v9 `! k! X& I描述:声明不可能到达.多出现在这种场合:2 ~/ v3 t; B4 p) u+ K
int main(void)
$ ]) l5 H' j: }0 d{1 p( c  i4 N  u
...4 l# m- o2 p: _9 F7 f, L  Z" `' ?- N
$ C$ @) K* J' G
while(1) //无限循环,这在不使用操作系统的程序中最常见* ]( X6 r) n' G2 U
{& c  {3 Y( P* Z% ~' V
...
1 o  F6 V3 ?7 s5 R
3 P  Z* D; B) k9 I% N2 q$ t}4 R4 L8 {6 O* {& @

" `- \0 m& ]% q% b) j) \9 Sreturn 0; //这句声明在正常情况下不可能执行到,编译器发出警告
/ ^$ J6 u& X5 k}
! w! V5 z% h# z2 o6 P7 u% C2 k! G% k& j6 G2 o
解决:不理会., P- l7 t% K: t$ J2 G
# a- h( C$ a; Z# [1 z
' P/ J/ e+ N; O) U0 B% y. ?
warning: C3017W:4. warning: C3017W: data may be used before being set
9 R* t9 k( y2 L$ p. ?描述:变量'data'在使用前没有明确的赋值.如:
& r# H0 r) H9 I$ K! |uint8 i,data; //定义变量i和data,二者都没有明确赋值
& s9 T0 U2 I7 B" I& u0 v1 _
& g& f3 F% G# R8 t8 Rfor ( i = 0; i < 8; i++) //变量'i'在语句中被赋值0
  Z+ [8 B7 j) z/ d% p* M" a{9 K) X  n5 J) N5 d5 L* B: `
if ( IO1PIN & SO_CC2420 )
: g2 W7 |0 `. Z) d+ W/ C; k+ ?data |= 0x01; //变量'data'在使用前没有明确赋值,编译器发出警告) M8 u' Y+ v6 r" l7 W# l" g
else
: W; N/ X( {" G$ l9 s- S( t1 pdata &= ~0x01;
, x! `- \, Y7 F. Q4 p. n}' q/ {; Q' {. p. j
解决:应仔细衡量该变量的初始值是否为0,若是,可以不理会这个警告,因为MDK编译器在程序执行前,会将使用到的数据区初始化为0,但若是该变量的初始值不应该是0,忽略这个警告可能会引起致命错误.这个警告应引起足够重视.应养成变量赋初值的习惯,好在有编译器给把关.
8 C; M, L9 W8 U: T% ]

4 U! y  _4 x. W9 X2 @7 `7 X( Mwarning: #177-D:5. warning: #177-D: variable "temp" was declared but never referenced
" o5 w. K3 @) ]8 l  L' A描述:变量'temp'进行了声明但没有引用.多出现在声明了一个变量,但却没有使用它,它和warning: #550-D: variable "temp" was set but never used不同之处在于temp从没有使用过.
$ ]8 z6 n" q. A$ f解决:若是定义的变量确实没有用,删除掉;若是有用,则在程序中使用.
$ f2 {5 d- v3 i! N& Q7 ~& p. k
与该警告类似的还有 warning: #177-D: function "MACProcessBeacon" was declared but never referenced
9 b7 V7 C# n' F  n2 a1 i  S

- R% B6 R5 d9 M! ^) ~- B4 F$ Wwarning: #940-D:6. warning: #940-D: missing return statement at end of non-void function "DealwithInspect2", j# n5 Q- Q8 P7 B# `$ y
描述:返回非空的函数"DealwithInspect2"的最后缺少返回值声明.如:
0 j9 x; t7 t2 b8 o; ?int DealwithInspect2(uint32 test): X. a5 ^# j7 I( e7 Z
{
$ G! B' L1 J! R+ L/ j...
) y  b5 K0 M+ q0 K+ ?...
7 T4 i7 ^9 ?4 x+ }...
1 q; O: {8 d6 o2 G//此处应该是return x;返回一个int型数据,若是没有返回值,编译器产生警告
0 `9 A- z  l0 Z/ \) Z* |' d. c8 |}
' l3 J  A$ t4 F6 h8 W+ K; c2 J* ]8 }6 F! ]1 J9 Q9 W
.warning: #1295-D:7..warning: #1295-D: Deprecated declaration lcd_init - give arg types
5 }6 w% T+ v  l0 r
+ k8 A" W' X+ p3 l. z, u" o描述:在定义函数的时候,如果你写上函数参数,就会有这个警告,比如void timer_init(); 这里就没有形参,如果这样的话,编译器会给出警告.
$ t9 k: f& R7 b8 c: z1 ]  t* ~. t' T+ g' @
error: #65:1. error: #65: expected a ";"
7 O5 @. O. x+ ~, G( W( y4 t描述:缺少分号.大多是漏忘';'./ k, v3 T. X" n: Y6 T1 i
解决:双击错误行,在定位到错误点的附近找到没加';'号的语句,加上分号.并不一定在定位到的错误行才却分号,可能是这行的上一行,也可能是下一行.
: ?' h# \2 i# j2 r
) X0 A. u6 u4 t: j% h6 D
error: #65: error: #202. error: #65: expected a ";"和 error: #20: identifier "xxxx" is undefined一块出现,而且后面的error: #20错误可能一大堆; m6 H' I" g+ E' v/ w: l- Z' @$ @
描述:这个错误对于第一次遇上的人来说绝对是个噩梦,当错误出现,满怀希望的双击错误提示,来到错误行时却愕然发现,错误行绝对没有错,于是找找错误行的上一行,下一行,没有错误,再找上上行,下下行...让人无比郁闷的事情出现了:编译提示的所有错误行都不可能有错误出现.其实这最可能是你在.h文件声明外部变量或者函数时,没有在声明语句的最后加分号!如果你有很多模块,如main.c,lcd.c,key.c...有很多头文件,如lcd.h,key.h,若是在lcd.h文件声明函数时没有加分号,那么这种错误可能定为到main.c中,所以要检查所有头文件.
' B% g6 w4 t3 X5 o3 j, P解决:仔细检查.h文件,将分号补上.
8 N6 c& g" U7 u9 m/ y( q( ~' W
/ h- i% S5 R% e  R" u
Error: L6200E:3. Error: L6200E: Symbol flagu multiply defined (by uart0.o and main.o).
0 c4 C4 t. ]6 _! \( W3 x8 [# l5 H0 B1 x! b+ q6 @6 N5 w
描述:变量(也是一种符号)flagu多处定义(在uart0.c中和main.c都定义了).通常错在全局变量定义重复.比如:在main.c中定义全局变量flagu:1 t# E6 h( V( L! O5 |4 S% L

$ s7 M& x7 b% g  Buint8 flagu=0;
' v+ o" s" ?  n9 ]# [+ s9 Y$ m  }1 H/ L" g# t7 }4 p$ a; }
在uart0.c中也用到该变量,于是声明此变量,我通常都是先复制定义的变量再在变量前面加关键字extern修饰:
9 m; Z' k* q" z6 l5 c  f  Q' ^$ V6 Y6 Q3 c7 E4 V
extern uint8 flagu=0;# m) s  b" E; x: G5 r* ~# K
2 z% U6 R7 _, U/ @$ Q( e
然后编译,就会出现上面的连接错误,原因在于,我在uart0.c中是又定义了一个变量,而不是声明变量,因为我给变量赋了初值"flagu=0",这样就重复定义了变量flag.正确的声明方法是去掉赋值部分:! N$ U# ?: X2 U8 D8 \; S
% Y7 ~% l! s/ L8 z5 `' c
extern uint8 flagu;
. K9 S: i( K7 @/ Y- C) k6 z  j5 k/ R" F9 `, V
解决办法:找到重复定义的变量,看情况修改一处.6 ~$ ?, u( `; w! u3 H; ], b! d
, N+ Q2 n1 G6 q1 ~
error: #159:4.error: #159: declaration is incompatible with previous "wr_lcd" (declared at line 40): l0 H: ?2 E$ B
描述:在wr_lcd函数还没有声明之前就已经使用了.多出现在两种情况:第一种,wr_lcd函数体还没有写,就已经用到了它,这种情况多出现在写一个程序的大体结构中,只是简单写一下框架.第二种情况比较常见,函数a调用函数b,但函数b的函数体在函数a的下面:5 \6 J# }  a- k+ F; }; n5 H8 j& m
void a(void) //函数a的实体0 R9 ?9 P7 T- I  T
{  S+ V& A1 U7 h1 C! H; n' h
b(); //调用函数b  B' Y  F" c3 D2 A
}. Q1 @  w( Q& [! }. k% D- T  B7 S

& K+ C1 h# W  [& |( svoid b(void) //函数b的实体6 s4 `+ c' |+ E; C9 q6 C
{
; Y: a6 ?$ C8 K1 s6 X3 `...9 C5 n. d: p/ ^# Y
}: ]1 {1 W& `; H) d- y5 J
这样如果点编译,就会产生error: #159的错误,因为当函数a调用函数b时,发现在这之前都没有函数b的任何声明.
. i' f. Z) Q# _/ Z' L1 y解决方法:在函数a调用函数b之前,对函数b进行声明,如:
4 o, X: ~  m" Q5 C# B
void b(void); //对函数b进行声明
& ]% q! I2 @) @6 V$ \, Y9 f

) R1 l1 O* k+ z6 D% g7 ~7 t
void a(void) //函数a的实体
, H6 p- O4 [  y& j. Y- q0 M4 r
{8 S+ O+ ~- H$ ?+ F& k6 E2 [9 \
b(); //调用函数b4 a9 I7 n) q, n% j/ I7 N% F% M* c
}
& X. G: a) H7 X6 j9 |) }+ u
! |. H- A8 Z2 e7 E* _
void b(void) //函数b的实体
& R$ P: v* r9 D# w1 S6 S
{
% l* A+ {3 C+ R7 z/ s
...9 E$ m% t2 g5 q  q& s# m1 t4 o
}! j! d' ^2 E# h( o1 k
) l/ o# j/ N$ ~. e8 f
error: #137:5. error: #137: expression must be a modifiable lvalue
1 k* ]% f" W4 Q0 G8 X9 O
8 y5 t; D0 G7 T4 i# a' k描述:表达式必须是一个可以修改的左值.主要出现在这种现象:
2 y2 r1 S( _2 I5 _- D" n2 t. v: t& ]9 I" p+ Y! E. O0 s4 E* c1 v3 E
a=NUM;
9 W6 w* G1 N2 N8 L, u3 E& m0 F: n& u1 }2 W- h# I
NUM是一个数值或表达式,a为一个变量,但a被定义为像const这种不可更改的类型,导致NUM不能赋值给变量a.+ h1 }& l: m, b

8 J" @9 t# L3 d. q: c解决方法:要么放弃赋值,要么修改变量属性.
6 ]' l6 Z( j1 s; B0 T

" D0 b5 F. L$ ^( Lerror: #1113: 你的固件库里的库文件没有添加进工程里面,所以出现未定义的情况。
3 G* G+ A4 [. L+ }TIM2_IRQChannel指定时器2的中断通道没有定义,其实在固件库对这些参数都有定义,宏定义代替了一串寄存器地址数据。需要将.C文件添加到工程文件中__asm放到一个单独的子函数再被调用就没问题了
1 Z! S$ ~0 ~+ z3 P" @如下:
3 O4 d; G, F- T" r2 ?6 C, y9 c
__asm void nop(void)$ j' _$ k5 y+ a* \/ O: k4 Z
{8 q, N+ Q( F: }
    NOP9 l' M# L/ t+ ?& o2 U
}
6 Y) E$ {7 n5 h3 _& p7 U
然后在之后的C代码中调用该函数:/ d; d& n* q! i9 R# n. e* y
void main(); Z. F1 e3 Y* o2 F+ t
{
" F  i* p# h( e; Y4 [/ I0 @
...
* v% m1 |* |; O. P; q4 N3 @nop();! T1 K6 m8 e! X7 ?4 P' P% B- v
...
+ k7 D9 H% b7 z, U9 c8 s3 M& n
}
& Y4 I5 u. b) f  a! `7 P- u
收藏 1 评论11 发布时间:2015-1-28 10:27

举报

11个回答
天天晓宇 回答时间:2015-1-28 11:30:48
不错不错,支持下
stary666 回答时间:2015-1-28 12:19:10
wu1169668869 回答时间:2015-1-28 12:29:21
两个都是楼主发的啊
时光碎了天 回答时间:2015-1-28 12:37:09
很不错的
cxtarm 回答时间:2015-1-28 12:49:41
wyxy163@126.com 回答时间:2015-1-28 14:52:10
提示: 作者被禁止或删除 内容自动屏蔽
wangweili1978 回答时间:2015-1-28 19:43:33
我是来学习的。
chendiand 回答时间:2015-1-28 20:09:41
先留着
+ o' c% Y4 a! V, @) X  F, o; N
qianfan 回答时间:2015-1-28 20:47:03
支持下。。。
feel-376797 回答时间:2015-1-29 05:34:38
谢谢楼主分享!
holts1 回答时间:2015-1-29 08:12:56
总结的好……。

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版