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

Keil编译常见问题(二)

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

3 ~+ i1 i: I9 Y0 s8 m9 k4 f9 w8 ]Keil编译常见问题(一)
) P/ _* ?0 T- o- p
' A0 a9 G" _! l# Ewarning:  #1295-D:
warning:  #1295-D: Deprecated declaration ShowSendTime - give arg types9 \- s" X/ }6 Y  _* W# Q. G0 L# L
解决方法:将void ShowSendTime()改为void ShowSendTime(void)
% g# p3 o6 [" |7 R5 i/ T2 q+ u- K& |( C. `0 q4 X( z0 z8 M
warning:  #550-D:warning:  #550-D: variable "d" was set but never used
2 u: X% T* x0 W1 {; T; F. G
描述:变量'd'定义但从未使用,或者是,虽然这个变量你使用了,但编译器认为变量d所在的语句没有意义,编译器把它优化了.( I3 H8 a4 {  \7 s
解决:仔细衡量所定义的变量d是否有用,若是认定变量d所在语句有意义,那么尝试用volatile关键字修饰变量d,若是真的没有用,那么删除掉以释放可能的内存.
& I( u. ]2 h) ~7 q
8 g9 v. [5 G! u1 p4 y  xerror:  #159:你的固件库里的库文件没有添加进工程里面,所以出现未定义的情况。6 W% a6 z) W: |+ }: f
TIM2_IRQChannel指定时器2的中断通道没有定义,其实在固件库对这些参数都有定义,宏定义代替了一串寄存器地址数据。需要将.C文件添加到工程文件中解决方法:在函数a调用函数b之前,对函数b进行声明,如:; {2 b' _7 Y/ A- _
void b(void); //对函数b进行声明
; g7 B6 |7 j4 h4 j) a5 mvoid a(void) //函数a的实体
& M3 g" h& |0 x( c
{
/ {4 ~2 @1 O4 r. Q9 D9 A! n' m, g7 X
      b(); //调用函数b0 Q! I! P- r1 [$ ]
}1 Y1 S- Y+ Q5 g
void b(void) //函数b的实体
5 x2 M! O; P% {3 \( n8 g1 R
{& A, @8 n0 n* i
     ...( c0 ~" u" m% q% n/ y2 Q* G5 u, t1 Z& l
}- \8 A5 s, ]. O  V) ~% E6 `' X/ H
error:  #70:error:  #70: incomplete type is not allowed
1 `) }& Q* H2 T1 q4 g你的固件库里的库文件没有添加进工程里面,所以出现未定义的情况。4 h; t. R' M! x  _# O5 f! P0 M; A7 Y& E* e
TIM2_IRQChannel指定时器2的中断通道没有定义,其实在固件库对这些参数都有定义,宏定义代替了一串寄存器地址数据。需要将.C文件添加到工程文件中
" S3 M9 K1 Q' w% R9 O8 B* K; v1 I( C4 L( K/ }
8 J/ ?9 [; N0 |- X0 g
warning: #550-D:
1.warning: #550-D: variable "d" was set but never used( E- [3 f. z: X" ?% i6 S( _
描述:变量'd'定义但从未使用,或者是,虽然这个变量你使用了,但编译器认为变量d所在的语句没有意义,编译器把它优化了.
) c! m& z" z! U6 R2 H- ?解决:仔细衡量所定义的变量d是否有用,若是认定变量d所在语句有意义,那么尝试用volatile关键字修饰变量d,若是真的没有用,那么删除掉以释放可能的内存.3 t: `6 Q8 y  y4 F3 m9 d1 r
" P' o3 t  T. P( Z1 Y" ]
warning: #1-D:2.warning: #1-D: last line of file ends without a newline
$ k% ^/ t5 k% v1 Q) p5 @. E: u描述:文件最后一行不是新的一行.编译器要求程序文件的最后一行必须是空行,想了半天没想通为什么要这样.
2 z0 |7 m5 h0 C解决:可以不理会.若是觉得出现警告不爽,那么在出现警告的文件的最后一行敲个回车,空出一行.8 _* K- r" L2 ^

/ A  H' `1 ~4 A4 F% c. C- J/ Kwarning: #111-D:3. warning: #111-D: statement is unreachable: V8 Y0 W" l3 ]+ v
描述:声明不可能到达.多出现在这种场合:
) i- y+ b1 S, g5 s( F+ Pint main(void)& j: Z  X4 }8 @3 q! {1 s
{3 M1 U( A, \* y
...
8 N' Z/ Z2 h9 `. r7 M1 O! x, w( y0 A# a, y
while(1) //无限循环,这在不使用操作系统的程序中最常见
% V- s3 e9 X; Q2 M& X{
4 ^; G  K9 Y9 E# d! A$ H! ?...5 }4 y: l$ f! S
! }8 G0 _+ }  R6 h5 {) W: d) P
}  f3 ]3 H- q7 G7 ~4 ^# t  w2 ?
% m7 J' z0 Z2 R" x( s) G. M1 E9 x4 k
return 0; //这句声明在正常情况下不可能执行到,编译器发出警告
! K1 {* [4 f, r" e}, f0 w$ g9 T2 x9 F

6 j5 v0 `# E1 ?& C. F6 T解决:不理会.
9 Z( n; Q! ^2 \0 s+ W: Q
; X* v, X6 e$ `" w

& L9 K3 W* ^2 L5 U; N; gwarning: C3017W:4. warning: C3017W: data may be used before being set9 Y/ B: z: w2 e
描述:变量'data'在使用前没有明确的赋值.如:
. D8 q( }9 ]0 {+ W3 Zuint8 i,data; //定义变量i和data,二者都没有明确赋值; A' i# H+ @( ?: d4 i
; Z/ @# u6 ^; T) g& p
for ( i = 0; i < 8; i++) //变量'i'在语句中被赋值0) k7 I" j) O+ L/ x+ j
{0 U( s9 A- y. b1 z8 e/ g4 v2 m
if ( IO1PIN & SO_CC2420 )  f" N1 j2 u7 O" X7 g
data |= 0x01; //变量'data'在使用前没有明确赋值,编译器发出警告* b' B+ c0 u3 ^) i( a
else
4 X6 L* ?  v: S2 Z* |3 \' Odata &= ~0x01;
6 T0 x$ P5 Q  }% b  h}; u- {: c& C/ V4 n
解决:应仔细衡量该变量的初始值是否为0,若是,可以不理会这个警告,因为MDK编译器在程序执行前,会将使用到的数据区初始化为0,但若是该变量的初始值不应该是0,忽略这个警告可能会引起致命错误.这个警告应引起足够重视.应养成变量赋初值的习惯,好在有编译器给把关.: f. z2 O, \' H. O6 R

8 r0 z8 D1 O! c* |2 Qwarning: #177-D:5. warning: #177-D: variable "temp" was declared but never referenced3 U  R+ s6 ~1 ]0 t& P" |% y
描述:变量'temp'进行了声明但没有引用.多出现在声明了一个变量,但却没有使用它,它和warning: #550-D: variable "temp" was set but never used不同之处在于temp从没有使用过.
! _6 d' c$ y8 z2 j9 I& ]& A解决:若是定义的变量确实没有用,删除掉;若是有用,则在程序中使用.0 ?# K7 p3 |; x, n; W/ Y
与该警告类似的还有 warning: #177-D: function "MACProcessBeacon" was declared but never referenced5 @- p( z) V8 Y9 n! F
% C' a! I$ R$ E8 K  B/ a/ j/ y( O
warning: #940-D:6. warning: #940-D: missing return statement at end of non-void function "DealwithInspect2"5 D! O' k+ J: C$ m) L6 m
描述:返回非空的函数"DealwithInspect2"的最后缺少返回值声明.如:
7 ^$ Z4 ~7 {( c  D( [  Z3 U9 Pint DealwithInspect2(uint32 test)' |3 D! u5 T5 r* }- S+ g) H+ g6 X* w
{7 a$ o4 u* M. J* }
...
/ Z* y7 }: _: x  Y; j...
% ?0 i* C$ B( t...$ U9 F. w- u4 e' a
//此处应该是return x;返回一个int型数据,若是没有返回值,编译器产生警告
" B1 k6 y, m5 T- r3 a+ e4 u- c}% b) `" A0 W+ [" G

' E& R' l9 y' Q. l.warning: #1295-D:7..warning: #1295-D: Deprecated declaration lcd_init - give arg types' p6 c4 }2 ]  {3 `. L: Q( c

# U% o% b- b+ P) P描述:在定义函数的时候,如果你写上函数参数,就会有这个警告,比如void timer_init(); 这里就没有形参,如果这样的话,编译器会给出警告.
; b) Y! y- X& f+ }, P
9 h* g5 r8 u' [& l" yerror: #65:1. error: #65: expected a ";"
' v6 Q' q7 ^5 H% r0 n描述:缺少分号.大多是漏忘';'." t* x0 ]& L5 b7 w6 g0 T; w" h2 O
解决:双击错误行,在定位到错误点的附近找到没加';'号的语句,加上分号.并不一定在定位到的错误行才却分号,可能是这行的上一行,也可能是下一行.
) \7 e& b8 E9 _" L* H

6 w0 a' V; ]7 I5 W8 y7 Terror: #65: error: #202. error: #65: expected a ";"和 error: #20: identifier "xxxx" is undefined一块出现,而且后面的error: #20错误可能一大堆* c7 @5 V. S8 z
描述:这个错误对于第一次遇上的人来说绝对是个噩梦,当错误出现,满怀希望的双击错误提示,来到错误行时却愕然发现,错误行绝对没有错,于是找找错误行的上一行,下一行,没有错误,再找上上行,下下行...让人无比郁闷的事情出现了:编译提示的所有错误行都不可能有错误出现.其实这最可能是你在.h文件声明外部变量或者函数时,没有在声明语句的最后加分号!如果你有很多模块,如main.c,lcd.c,key.c...有很多头文件,如lcd.h,key.h,若是在lcd.h文件声明函数时没有加分号,那么这种错误可能定为到main.c中,所以要检查所有头文件.1 i: W- ~, d" }6 B: ~- m' D( a3 w+ J; l
解决:仔细检查.h文件,将分号补上.
# o6 K: w9 T, v1 d; ]  A
! ^" ~. r6 m/ g( x5 e
Error: L6200E:3. Error: L6200E: Symbol flagu multiply defined (by uart0.o and main.o).
1 d* m2 d- v8 U. v4 K3 R! F
" ?7 e4 J" U. {+ q. k描述:变量(也是一种符号)flagu多处定义(在uart0.c中和main.c都定义了).通常错在全局变量定义重复.比如:在main.c中定义全局变量flagu:5 U* i& C( \' K7 u  u' K4 L2 p
; M/ b$ f/ i# t1 i+ ]  X
uint8 flagu=0;
% @: ~, B! \0 B! q
! {9 [& J  s$ H" K5 q在uart0.c中也用到该变量,于是声明此变量,我通常都是先复制定义的变量再在变量前面加关键字extern修饰:
* h( M( [  {1 g: X+ y+ W; ?/ ~4 i; k' n8 D7 V" J
extern uint8 flagu=0;
3 W4 d( @  }' u5 L2 q" Q4 T# N2 C2 _: C3 `; m* k
然后编译,就会出现上面的连接错误,原因在于,我在uart0.c中是又定义了一个变量,而不是声明变量,因为我给变量赋了初值"flagu=0",这样就重复定义了变量flag.正确的声明方法是去掉赋值部分:
6 }2 |( u# B" q  c7 t+ C3 Q. S; W8 |2 G3 n+ U
extern uint8 flagu;
# T0 X) w6 j! P6 z' c% U9 U
) K5 T% A( j3 H& t6 }! k解决办法:找到重复定义的变量,看情况修改一处.9 S9 B+ A6 g% u
: S' f8 C  @7 `; |, B: i- b, [2 ]
error: #159:4.error: #159: declaration is incompatible with previous "wr_lcd" (declared at line 40)% c' u" l; y3 `& ?% M
描述:在wr_lcd函数还没有声明之前就已经使用了.多出现在两种情况:第一种,wr_lcd函数体还没有写,就已经用到了它,这种情况多出现在写一个程序的大体结构中,只是简单写一下框架.第二种情况比较常见,函数a调用函数b,但函数b的函数体在函数a的下面:
( ^) }% D, g% t  q) Y* F* A3 @8 ]void a(void) //函数a的实体. z4 o+ J8 h0 j
{2 l# j8 C0 X2 t$ A, |, G4 o
b(); //调用函数b
* o* K! ^6 P; X$ k) t}
: S: i: X( s- ~4 [% x( N# I+ Y+ h: }( {3 F" F' O; `
void b(void) //函数b的实体
$ Q; N7 ]* U$ m  q{
- k4 u7 I( A: q/ f* W+ p7 l..., x1 x" F" g% h% h& ]
}0 Q5 N, R4 L, a6 U- H% r$ A' {  h5 R
这样如果点编译,就会产生error: #159的错误,因为当函数a调用函数b时,发现在这之前都没有函数b的任何声明.
0 K; g5 D; d( J5 X! N: e# ]解决方法:在函数a调用函数b之前,对函数b进行声明,如:: H/ K$ o3 q! o* l
void b(void); //对函数b进行声明8 t% Z8 Z9 u+ \% ~
+ _# H: N! h0 Z; P$ h# G
void a(void) //函数a的实体: X# p: D/ q( ?! i) |$ B" J. a3 `
{, q/ I$ `9 k2 w4 T9 d" z1 a0 o
b(); //调用函数b
4 C4 d5 l' \0 _* @
}# ~1 H9 i  C$ Y& K1 s

- {; R$ ]6 V" H
void b(void) //函数b的实体
/ g- B# a; ]& c8 v0 J
{' s: r) }4 t. ]
...) N' O# N( V7 }! Q' X/ n" s+ Q# v
}  ^- a2 w, x  y! ?% P

6 k: O, l2 c$ D+ b: b6 O; derror: #137:5. error: #137: expression must be a modifiable lvalue$ [4 k/ a$ L: }5 J
8 I- b1 y$ J+ G- V
描述:表达式必须是一个可以修改的左值.主要出现在这种现象:. U# x: x' [  D7 ?; Y) ~1 [1 p& \
  _! ]4 F/ t9 M  t
a=NUM;
  w" k0 \, @/ h9 a! \: U( Z% P5 ~( O- I3 J8 I$ U% u2 P4 C
NUM是一个数值或表达式,a为一个变量,但a被定义为像const这种不可更改的类型,导致NUM不能赋值给变量a.
; j1 P2 b+ Y/ o/ @0 u
6 j, U4 A6 W) C9 C7 @解决方法:要么放弃赋值,要么修改变量属性.
* `" u8 H5 p) e' B
8 [5 o2 W3 r. v! ?- C* O- c! M* m( \2 ^
error: #1113: 你的固件库里的库文件没有添加进工程里面,所以出现未定义的情况。
! B- w2 n. \# z* {, pTIM2_IRQChannel指定时器2的中断通道没有定义,其实在固件库对这些参数都有定义,宏定义代替了一串寄存器地址数据。需要将.C文件添加到工程文件中__asm放到一个单独的子函数再被调用就没问题了6 \4 A  O" |8 p- R9 ^
如下:
& d; c7 k& f3 [) g6 K6 O9 c
__asm void nop(void)6 p* ~6 J! x5 [# T4 b- N% g* L
{; n6 o* K6 L% H" J
    NOP( L/ \  v- @( C* J# g$ j$ n
}
% U" X' ]. }& Y/ O" ?
然后在之后的C代码中调用该函数:. h( }" S# C' R! @# G8 X% z) D
void main()
; t$ V/ q; Y2 K; `
{
' Z7 E4 f8 D  S  ?1 g0 z
...
4 j4 I% a8 E* }+ \1 @, T9 Y% rnop();# d6 ?% L* {( p+ d
... 0 `* p, ?# d. M7 x2 e) x
} ; k1 A% a2 a. E. p* R/ T5 C* ^
收藏 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
先留着9 B' G+ t, Q* x
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 手机版