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

Keil编译常见问题(二)

[复制链接]
kqh1120 发布时间:2015-1-28 10:27
- R: s& U, b  n7 _' r
Keil编译常见问题(一)
0 o: |8 L3 I8 {2 q$ y. z& a' B$ {, B# d# B3 O
warning:  #1295-D:
warning:  #1295-D: Deprecated declaration ShowSendTime - give arg types/ F+ _$ D2 h3 V* F& i2 ]) t
解决方法:将void ShowSendTime()改为void ShowSendTime(void)' O- P4 a' ^4 }, W+ g5 Q
) t% V' R: R- i+ @- p+ @
warning:  #550-D:warning:  #550-D: variable "d" was set but never used
0 p# j; Y7 w$ k
描述:变量'd'定义但从未使用,或者是,虽然这个变量你使用了,但编译器认为变量d所在的语句没有意义,编译器把它优化了./ f( j" `1 s, Z6 Z. [, y( U) Q# t
解决:仔细衡量所定义的变量d是否有用,若是认定变量d所在语句有意义,那么尝试用volatile关键字修饰变量d,若是真的没有用,那么删除掉以释放可能的内存.& i* d+ G8 w1 Y0 z# R

& G) e0 k6 w+ U8 `0 werror:  #159:你的固件库里的库文件没有添加进工程里面,所以出现未定义的情况。
3 T8 [5 V  X- T1 ?. \& @+ _TIM2_IRQChannel指定时器2的中断通道没有定义,其实在固件库对这些参数都有定义,宏定义代替了一串寄存器地址数据。需要将.C文件添加到工程文件中解决方法:在函数a调用函数b之前,对函数b进行声明,如:
5 ]! @; Y9 x+ u' i" I7 d: R
void b(void); //对函数b进行声明2 d/ Q( e2 f' M! ~" v
void a(void) //函数a的实体8 l9 J' G3 M1 }1 H' z9 t
{- l7 u' D! l; Z# |9 ?8 d: L1 t% E) c
      b(); //调用函数b' }" y; W& |0 |1 K# p4 g, K' h
}
' ^7 b; {$ p6 O  _3 C+ u6 Ivoid b(void) //函数b的实体6 I& P5 I' ^! I/ I" i3 Q
{, Z! H: ^( F: R0 w1 j9 W
     ...
8 e& Q  f5 x& T9 r0 w% A* X
}  M1 O+ _* M; p- q# }3 ^" s! r, s
error:  #70:error:  #70: incomplete type is not allowed
. J2 b. Z* l1 {8 [你的固件库里的库文件没有添加进工程里面,所以出现未定义的情况。
% I/ F8 F9 t9 t: ~3 b0 LTIM2_IRQChannel指定时器2的中断通道没有定义,其实在固件库对这些参数都有定义,宏定义代替了一串寄存器地址数据。需要将.C文件添加到工程文件中
* ~7 O8 j" `! f
  Y! p2 F+ L- s
' t7 b3 d* L, xwarning: #550-D:
1.warning: #550-D: variable "d" was set but never used4 R' X6 S. h9 C6 P& t+ }
描述:变量'd'定义但从未使用,或者是,虽然这个变量你使用了,但编译器认为变量d所在的语句没有意义,编译器把它优化了.$ ~: h7 N" g0 O+ `% S
解决:仔细衡量所定义的变量d是否有用,若是认定变量d所在语句有意义,那么尝试用volatile关键字修饰变量d,若是真的没有用,那么删除掉以释放可能的内存.
' r) r0 m/ _$ K1 r# J0 g

" c8 U( A! A" X$ G& y: C" d3 Bwarning: #1-D:2.warning: #1-D: last line of file ends without a newline
) V1 e. i+ I$ @& a4 b! P' `描述:文件最后一行不是新的一行.编译器要求程序文件的最后一行必须是空行,想了半天没想通为什么要这样.1 K' d6 ^! h' ?/ I* [
解决:可以不理会.若是觉得出现警告不爽,那么在出现警告的文件的最后一行敲个回车,空出一行.
2 I; z4 n$ X( x$ A9 n# S* `; B
+ O2 Q! L8 H6 F2 d; Y, n
warning: #111-D:3. warning: #111-D: statement is unreachable' O; y7 {! [! l8 @; W; ]$ Y' L
描述:声明不可能到达.多出现在这种场合:
! s" a0 w$ {+ g' Hint main(void)
; [$ W8 Z& Y! K' [( M, ^/ K3 q3 {{+ E& j2 u' [+ `5 s  I$ d2 ^
...
8 G  Y5 c  z, E/ F& |( v7 k& G4 D& ~/ E, ?1 S, _* U% i( u
while(1) //无限循环,这在不使用操作系统的程序中最常见
8 c5 ?& Q) V& z$ o4 \{
+ v/ }$ l5 @+ ]+ q* B  J: @! f...
/ Q# H0 B' z3 {' g- ^1 ^1 j7 s% Q% v% E
}3 B6 n( {( f, a( H+ n
) i7 {. ]7 b0 b% f
return 0; //这句声明在正常情况下不可能执行到,编译器发出警告
. ~4 [8 B4 z2 |7 _1 o$ i4 S}
* l" J1 r3 w; C1 B0 G* Q; [: [% w3 M  ?' C
解决:不理会.9 A6 p# @7 z# j9 n' _) O% s

- _8 Y8 Z$ j% w: W5 C' m2 Y0 p0 h7 H4 M, S" B  _5 j0 O" w( r
warning: C3017W:4. warning: C3017W: data may be used before being set# p; O9 Z& Z/ l4 R3 a
描述:变量'data'在使用前没有明确的赋值.如:. M" X# ]; z7 x
uint8 i,data; //定义变量i和data,二者都没有明确赋值; E6 M7 M' m5 o0 @3 U9 O6 J
1 D6 ^# J, V2 R( V
for ( i = 0; i < 8; i++) //变量'i'在语句中被赋值01 J% k& b- {7 m7 b8 V$ A
{7 e% @' s# ]# v  ]; T% w
if ( IO1PIN & SO_CC2420 )2 D1 @/ C4 m* a) Z0 N
data |= 0x01; //变量'data'在使用前没有明确赋值,编译器发出警告
; w/ d+ _  f& g7 Celse
) n8 T5 d( z! K" ~* z' A) Xdata &= ~0x01;
1 ^- r" {1 z4 X: H7 w+ x6 _}
5 ^; `+ C/ w  N- N3 D解决:应仔细衡量该变量的初始值是否为0,若是,可以不理会这个警告,因为MDK编译器在程序执行前,会将使用到的数据区初始化为0,但若是该变量的初始值不应该是0,忽略这个警告可能会引起致命错误.这个警告应引起足够重视.应养成变量赋初值的习惯,好在有编译器给把关.
' a4 }( z: l" i$ ^- s! L2 E

" K' b- t9 X8 U; @& {8 G) t, `warning: #177-D:5. warning: #177-D: variable "temp" was declared but never referenced
0 H, X1 W& q/ k" \+ Q描述:变量'temp'进行了声明但没有引用.多出现在声明了一个变量,但却没有使用它,它和warning: #550-D: variable "temp" was set but never used不同之处在于temp从没有使用过.$ u/ v% ]2 L9 ?
解决:若是定义的变量确实没有用,删除掉;若是有用,则在程序中使用.( E* y% k$ e, u* ]
与该警告类似的还有 warning: #177-D: function "MACProcessBeacon" was declared but never referenced& K4 Z! }3 K3 e2 f4 s: b, A; ^0 I, s

2 X9 Y- a5 |, ?. Z2 S9 o( Dwarning: #940-D:6. warning: #940-D: missing return statement at end of non-void function "DealwithInspect2"
" K" ^% _8 e) V+ R# J' I描述:返回非空的函数"DealwithInspect2"的最后缺少返回值声明.如:2 X: ^. p. e1 P$ r, N
int DealwithInspect2(uint32 test)
' E  D1 Q+ M; L, w/ }{/ R% q* P# ?( E7 j) v' C
...! F: P# r* i) Y% i, P
...6 U8 A1 e3 O6 |1 {4 E
.... t4 t  C2 H1 Z; }% r: ]
//此处应该是return x;返回一个int型数据,若是没有返回值,编译器产生警告
& t" ?/ z8 A' d; z7 {- r, o}
+ k& t6 o) G8 ]3 v
8 [" Y- u. n- j) L/ @.warning: #1295-D:7..warning: #1295-D: Deprecated declaration lcd_init - give arg types
: a6 T9 M, ~5 O  w/ q! j. d3 q- l; ]7 o! j" i9 r$ ~6 u" z3 H
描述:在定义函数的时候,如果你写上函数参数,就会有这个警告,比如void timer_init(); 这里就没有形参,如果这样的话,编译器会给出警告.
' u9 U, d: c# P5 [" v
7 ~5 ]% `8 i, I" |error: #65:1. error: #65: expected a ";"
# w5 B. z8 e2 m& b; G2 ?描述:缺少分号.大多是漏忘';'.) ?) y) |  k+ ^, E8 C6 |
解决:双击错误行,在定位到错误点的附近找到没加';'号的语句,加上分号.并不一定在定位到的错误行才却分号,可能是这行的上一行,也可能是下一行.
0 _% Q# H4 B' W) x! D4 `

' Z( E% W! @- @$ verror: #65: error: #202. error: #65: expected a ";"和 error: #20: identifier "xxxx" is undefined一块出现,而且后面的error: #20错误可能一大堆# \" b! t5 Y' Z. l
描述:这个错误对于第一次遇上的人来说绝对是个噩梦,当错误出现,满怀希望的双击错误提示,来到错误行时却愕然发现,错误行绝对没有错,于是找找错误行的上一行,下一行,没有错误,再找上上行,下下行...让人无比郁闷的事情出现了:编译提示的所有错误行都不可能有错误出现.其实这最可能是你在.h文件声明外部变量或者函数时,没有在声明语句的最后加分号!如果你有很多模块,如main.c,lcd.c,key.c...有很多头文件,如lcd.h,key.h,若是在lcd.h文件声明函数时没有加分号,那么这种错误可能定为到main.c中,所以要检查所有头文件.
) ~- E( L/ ^  ^解决:仔细检查.h文件,将分号补上.' s$ K+ }& ^- Z- |; ~, E! M- z0 A0 N

# n4 [6 ~, e) GError: L6200E:3. Error: L6200E: Symbol flagu multiply defined (by uart0.o and main.o).4 `* Y% a1 B+ ]9 ^+ P; M

, ~. [4 c- H  b9 `& W" k: G0 `描述:变量(也是一种符号)flagu多处定义(在uart0.c中和main.c都定义了).通常错在全局变量定义重复.比如:在main.c中定义全局变量flagu:
& F: o+ ?. U+ F8 @4 y" G% C# F- g" e8 w. \" K
uint8 flagu=0;! [2 A( S9 _, t( N4 i0 Z: D1 Z+ f" k

$ V: O8 m4 P5 U& C- ]: p在uart0.c中也用到该变量,于是声明此变量,我通常都是先复制定义的变量再在变量前面加关键字extern修饰:/ l) n* |, l' t$ ?* D/ f
% t5 D# c% `: ~4 ^* S, j. f
extern uint8 flagu=0;8 R* W8 |2 u8 s5 T4 o9 Q
1 X+ G# h& p) X9 h, J
然后编译,就会出现上面的连接错误,原因在于,我在uart0.c中是又定义了一个变量,而不是声明变量,因为我给变量赋了初值"flagu=0",这样就重复定义了变量flag.正确的声明方法是去掉赋值部分:+ _$ d4 ?) R* p( A1 |# {6 A5 X

6 g$ s: P4 O$ v$ T% k6 fextern uint8 flagu;7 _. b5 a6 V- c' O  t
1 C5 I, G/ Y1 |. r- g9 q
解决办法:找到重复定义的变量,看情况修改一处.7 w! I8 H8 }! G: L2 W+ l

6 L1 w3 p  p% P3 O7 P5 z7 [( Ferror: #159:4.error: #159: declaration is incompatible with previous "wr_lcd" (declared at line 40)8 K4 z$ p" e8 O. c
描述:在wr_lcd函数还没有声明之前就已经使用了.多出现在两种情况:第一种,wr_lcd函数体还没有写,就已经用到了它,这种情况多出现在写一个程序的大体结构中,只是简单写一下框架.第二种情况比较常见,函数a调用函数b,但函数b的函数体在函数a的下面:; q4 U2 v  E( B: O6 H
void a(void) //函数a的实体
( H9 a, q( U3 V{
  o: B( a- D% ^! `3 qb(); //调用函数b
) @$ F: r& F) B7 h0 K; r: `+ F0 C}8 q" U' h, c# K' w! x0 o5 \

9 D7 m% P% |1 s8 \+ j# g  L0 zvoid b(void) //函数b的实体/ z4 R# W9 q5 G7 w- a8 Z
{
% H; y) l; d# w...
7 a2 N: n3 d- C$ o}% y0 d7 b7 j) F$ ]7 e
这样如果点编译,就会产生error: #159的错误,因为当函数a调用函数b时,发现在这之前都没有函数b的任何声明.- Z' _8 f; Q: q) i) D# s; m/ W
解决方法:在函数a调用函数b之前,对函数b进行声明,如:
/ C" X6 k9 ?2 [, W2 ^# w
void b(void); //对函数b进行声明% h1 {' ]8 U5 b, Q% C  S9 Q
4 x9 H4 g8 Z! j
void a(void) //函数a的实体
9 O5 R  l" ]: q; U# [7 s0 R
{
7 w) y- K- M7 x. l
b(); //调用函数b. P& x/ d. b0 e- t# ~( r  q$ d
}
( Z5 ]# Y+ H1 j6 n% f( F

( _8 B( V4 g; z  ~8 ]8 K
void b(void) //函数b的实体/ z0 @3 S/ e- f5 B  {0 t
{
$ J% Z/ k/ l( m" M! f. `7 k" m
...
7 a/ h4 W; I* i- |/ z, [7 o3 D
}
) X  A) W) N* {
. M* K7 d$ l; g' t% Q7 V
error: #137:5. error: #137: expression must be a modifiable lvalue( g4 W0 e. O! w9 t- H( R* X9 l
3 E# M% q# G6 u% a$ L9 I0 N; C
描述:表达式必须是一个可以修改的左值.主要出现在这种现象:
7 ]* W( p/ J* ~
+ J$ Q( v3 n3 b- ]* A# |a=NUM;
) p* ^/ v8 E( y. m- C4 L  }$ V+ `
1 E" O% a+ [" L  d4 j4 yNUM是一个数值或表达式,a为一个变量,但a被定义为像const这种不可更改的类型,导致NUM不能赋值给变量a., l+ J6 s8 K* h$ }) p" }

: |* [8 m" n6 i0 T解决方法:要么放弃赋值,要么修改变量属性.

) y. [8 A% p, a% G. s
, S5 l; J) `- q- `+ w9 cerror: #1113: 你的固件库里的库文件没有添加进工程里面,所以出现未定义的情况。
' R/ f  d% t* e. S, I" b% M1 _TIM2_IRQChannel指定时器2的中断通道没有定义,其实在固件库对这些参数都有定义,宏定义代替了一串寄存器地址数据。需要将.C文件添加到工程文件中__asm放到一个单独的子函数再被调用就没问题了
0 M: H" w: ~7 H6 b如下:1 j+ p) x# s" b; _3 a  Z
__asm void nop(void)/ Q$ v. r  T. [2 d% M- z3 |  d
{
# m8 l" {, s/ L% h- u& Q
    NOP
, C% s# K0 ~6 d" B1 D) |8 _! B}
% t! h" l$ T  `- K- h  }+ M4 m
然后在之后的C代码中调用该函数:8 X. r' l: q7 T' x0 Y$ C7 h
void main()# V0 s$ U/ K: U. @
{
) k9 G8 f! C  i1 H- r
...
$ T) J% i0 L2 hnop();+ O. Q9 ~$ [2 [! ~* `: h2 g
...
1 A( _- C/ f  Y( o1 L
} 8 i' M9 j2 s( f+ y2 D/ V
赞 收藏 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
先留着
7 b( k9 D/ ?4 m& T
qianfan 回答时间:2015-1-28 20:47:03
支持下。。。
feel-376797 回答时间:2015-1-29 05:34:38
谢谢楼主分享!
holts1 回答时间:2015-1-29 08:12:56
总结的好……。
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版