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

Keil编译常见问题(二)

[复制链接]
kqh1120 发布时间:2015-1-28 10:27
+ Q. t, j" v$ Y" D' ~/ }6 c5 `) s# B2 K
Keil编译常见问题(一)% c; @( B0 c. T9 H$ @
- k) A  A+ j7 n+ B) H
warning:  #1295-D:
warning:  #1295-D: Deprecated declaration ShowSendTime - give arg types
5 \8 h% [7 X9 }. t7 J& ]解决方法:将void ShowSendTime()改为void ShowSendTime(void)& Z, m$ k: e0 C( G) D. _

- M* p7 |! l2 `. swarning:  #550-D:warning:  #550-D: variable "d" was set but never used
; a4 S* {; O/ o1 X
描述:变量'd'定义但从未使用,或者是,虽然这个变量你使用了,但编译器认为变量d所在的语句没有意义,编译器把它优化了.1 p1 C. i' J$ `; B4 Y3 f
解决:仔细衡量所定义的变量d是否有用,若是认定变量d所在语句有意义,那么尝试用volatile关键字修饰变量d,若是真的没有用,那么删除掉以释放可能的内存.3 |# Y; k- E+ m+ x
0 w8 w# p( Q4 I4 T2 ^, i
error:  #159:你的固件库里的库文件没有添加进工程里面,所以出现未定义的情况。- I' p& N! \6 O6 W; {5 }1 t: R" w, I
TIM2_IRQChannel指定时器2的中断通道没有定义,其实在固件库对这些参数都有定义,宏定义代替了一串寄存器地址数据。需要将.C文件添加到工程文件中解决方法:在函数a调用函数b之前,对函数b进行声明,如:1 m9 C. w) S( b$ `; C4 ]9 c* V
void b(void); //对函数b进行声明
. u! v5 a4 z0 g  `7 r. uvoid a(void) //函数a的实体
* @+ E$ f5 y& |) u) J8 ?
{, Z  \, g, u* Y. r, B  q5 {
      b(); //调用函数b
+ }5 g. O9 n) `6 v8 w$ J
}0 }$ b5 f, Q& Y/ p% w7 _! R
void b(void) //函数b的实体
+ J' X. R: g1 H
{( X1 W" h+ j5 @5 n/ f" m* U/ Y
     ...
. R" i" W6 ^8 r, l$ W! L+ c4 Z
}
7 c$ A$ U4 T6 C4 {  L% d9 o1 `* o: nerror:  #70:error:  #70: incomplete type is not allowed! \! M5 a0 ^/ s7 R  \+ X, H3 j" g
你的固件库里的库文件没有添加进工程里面,所以出现未定义的情况。
( w  }0 ], i, y/ x9 p1 {TIM2_IRQChannel指定时器2的中断通道没有定义,其实在固件库对这些参数都有定义,宏定义代替了一串寄存器地址数据。需要将.C文件添加到工程文件中
: K% ^/ n9 {* q) ?& R% W# H+ I6 {9 S; P- H) e+ q$ q8 x

+ k# _- s& q0 Y* ~: a7 wwarning: #550-D:
1.warning: #550-D: variable "d" was set but never used5 D# B0 |4 u7 ~! K) f
描述:变量'd'定义但从未使用,或者是,虽然这个变量你使用了,但编译器认为变量d所在的语句没有意义,编译器把它优化了." y5 k+ m6 `3 D+ V# L* {0 w
解决:仔细衡量所定义的变量d是否有用,若是认定变量d所在语句有意义,那么尝试用volatile关键字修饰变量d,若是真的没有用,那么删除掉以释放可能的内存., I4 Q' X! ~- u. S
; J, J6 M2 Q& k  D* i" s! O* }
warning: #1-D:2.warning: #1-D: last line of file ends without a newline
- a1 {1 b1 \  I5 \7 {描述:文件最后一行不是新的一行.编译器要求程序文件的最后一行必须是空行,想了半天没想通为什么要这样.
. h" _; V: ?' V解决:可以不理会.若是觉得出现警告不爽,那么在出现警告的文件的最后一行敲个回车,空出一行.
* U0 [1 U  j; L

; _$ X) D' G% @' f( O+ @& Gwarning: #111-D:3. warning: #111-D: statement is unreachable2 j* J: ~5 A# f2 R& U* J+ T
描述:声明不可能到达.多出现在这种场合:9 O2 T9 M* U. \
int main(void)
: Y7 A$ i# Y9 L$ _) E, f. P{
+ S, p! p+ b1 j( _: l- m8 r...) ^% u1 P6 @2 ?+ A. n! u
  J: g7 z: @. C3 ~
while(1) //无限循环,这在不使用操作系统的程序中最常见
! X) O0 Y" |; A. p0 c{
: j1 k6 w  O& \5 ^5 c& ^...
* g/ D3 j/ b9 H+ W
9 s5 c" q/ C/ t& p  f}' b  a( f3 q% K# r7 p( K

0 \3 r# E' f0 [( o% X5 [$ N, Yreturn 0; //这句声明在正常情况下不可能执行到,编译器发出警告
* D$ L5 Z, O( u, ^. Q- P+ |* i}, k( R" x- s& r) M. a

# T* O, Y' X: i+ Y解决:不理会.* s: B3 w1 d. o8 I! |

& ^; n2 S2 ~; F. Y: m$ q! h4 D. i9 c( t$ i; [' b& j( @( N
warning: C3017W:4. warning: C3017W: data may be used before being set
7 P6 C, E" S: o6 e! h" g1 g描述:变量'data'在使用前没有明确的赋值.如:' e, d. N  l. c4 j/ ?% N
uint8 i,data; //定义变量i和data,二者都没有明确赋值
: Z/ g2 G, W7 p2 i2 A, I  y; E. ]" d2 H
for ( i = 0; i < 8; i++) //变量'i'在语句中被赋值0
/ t0 ?0 H% Z! g) Y, H1 c{+ ^% s5 |, {. u5 N) f1 e" g
if ( IO1PIN & SO_CC2420 )+ e  M5 w/ n+ I/ l" M
data |= 0x01; //变量'data'在使用前没有明确赋值,编译器发出警告2 S# \. k/ t! [
else8 m. \) a  F9 t, }& e  ~7 C6 j
data &= ~0x01;
7 m  ^; b5 d5 s5 W" v$ P! ~6 S}. g. X6 J! e6 P+ r
解决:应仔细衡量该变量的初始值是否为0,若是,可以不理会这个警告,因为MDK编译器在程序执行前,会将使用到的数据区初始化为0,但若是该变量的初始值不应该是0,忽略这个警告可能会引起致命错误.这个警告应引起足够重视.应养成变量赋初值的习惯,好在有编译器给把关.
; t& s% O+ |" ^% c! ]) I( V
' v& M/ \$ N* k
warning: #177-D:5. warning: #177-D: variable "temp" was declared but never referenced
) x4 r6 o, X' I* y6 Q' n描述:变量'temp'进行了声明但没有引用.多出现在声明了一个变量,但却没有使用它,它和warning: #550-D: variable "temp" was set but never used不同之处在于temp从没有使用过.  }8 W. r6 L7 u+ |- ]' m% j
解决:若是定义的变量确实没有用,删除掉;若是有用,则在程序中使用.
0 p! A5 t4 W4 [. N
与该警告类似的还有 warning: #177-D: function "MACProcessBeacon" was declared but never referenced+ V+ f9 I/ m! N1 h

: J2 Z0 G- E% b; ?' `5 N5 i0 f- cwarning: #940-D:6. warning: #940-D: missing return statement at end of non-void function "DealwithInspect2"
$ S2 [% o4 \5 @2 H描述:返回非空的函数"DealwithInspect2"的最后缺少返回值声明.如:
7 n1 T7 D  m* e  N% J; P5 `7 {int DealwithInspect2(uint32 test)! Q$ p1 T# o+ I6 f1 l- v% `/ P9 U
{7 x; s! u! D3 I. s
...  e3 I2 C# Y5 k" _! M0 I' N
...
$ e5 q$ @/ N6 K# S% e- {...
& v" Z2 c$ p- u& }7 Z/ q* B/ @//此处应该是return x;返回一个int型数据,若是没有返回值,编译器产生警告, S4 t  i( G: ?# T. v
}& `' F. ?/ D" j! r/ f
! G2 G4 I2 c" B- i
.warning: #1295-D:7..warning: #1295-D: Deprecated declaration lcd_init - give arg types
6 W. d7 {& G( m& Z. i5 p( N0 k9 Y
4 S; f% b: K8 `描述:在定义函数的时候,如果你写上函数参数,就会有这个警告,比如void timer_init(); 这里就没有形参,如果这样的话,编译器会给出警告.
2 Z+ |" x: G- v8 y' p3 \; [! ^4 E- p  o2 @, e& e- n0 B) D- D
error: #65:1. error: #65: expected a ";"
9 \  v: D. I: S! b) s2 J描述:缺少分号.大多是漏忘';'.
' P* y8 x3 y% i9 O$ V" _! |解决:双击错误行,在定位到错误点的附近找到没加';'号的语句,加上分号.并不一定在定位到的错误行才却分号,可能是这行的上一行,也可能是下一行.- w; w0 C) v1 c, s, S" K! V; ]& |( d

3 e) \1 J$ O8 m0 S7 D. Uerror: #65: error: #202. error: #65: expected a ";"和 error: #20: identifier "xxxx" is undefined一块出现,而且后面的error: #20错误可能一大堆
" L- {- H# w% a+ J3 a, x描述:这个错误对于第一次遇上的人来说绝对是个噩梦,当错误出现,满怀希望的双击错误提示,来到错误行时却愕然发现,错误行绝对没有错,于是找找错误行的上一行,下一行,没有错误,再找上上行,下下行...让人无比郁闷的事情出现了:编译提示的所有错误行都不可能有错误出现.其实这最可能是你在.h文件声明外部变量或者函数时,没有在声明语句的最后加分号!如果你有很多模块,如main.c,lcd.c,key.c...有很多头文件,如lcd.h,key.h,若是在lcd.h文件声明函数时没有加分号,那么这种错误可能定为到main.c中,所以要检查所有头文件.5 F4 ~* t0 v' }3 c1 p" D
解决:仔细检查.h文件,将分号补上.' G0 O3 R1 M; }
' y, }2 F+ r, e0 l7 S
Error: L6200E:3. Error: L6200E: Symbol flagu multiply defined (by uart0.o and main.o).
' c& w# v2 n# s& |: U2 Q% S
6 o5 \; S' Z2 q: L: {描述:变量(也是一种符号)flagu多处定义(在uart0.c中和main.c都定义了).通常错在全局变量定义重复.比如:在main.c中定义全局变量flagu:9 ~. U; o- l/ y7 L

- r& W. @, q; j2 Y( Buint8 flagu=0;
0 h# X5 l( ~7 @4 n/ k/ j# o. Z) D' O' ~6 V5 Q6 I
在uart0.c中也用到该变量,于是声明此变量,我通常都是先复制定义的变量再在变量前面加关键字extern修饰:3 \! `8 {' k' Q  f& H( Z  e

5 x" F/ ]* z, ^) T' oextern uint8 flagu=0;
% I$ V7 {5 W! J  P8 {. J, T& ?/ `4 u5 r3 w1 m& K
然后编译,就会出现上面的连接错误,原因在于,我在uart0.c中是又定义了一个变量,而不是声明变量,因为我给变量赋了初值"flagu=0",这样就重复定义了变量flag.正确的声明方法是去掉赋值部分:2 A. s3 D% q. l6 m/ Z1 m1 d
# F) ?4 V' r0 X# ^4 q2 t; U, l
extern uint8 flagu;6 B* R% f, Z; `" `7 q
5 _/ |% Z  k- x: [
解决办法:找到重复定义的变量,看情况修改一处.
" q1 y* t! D& K+ y, q+ ?: `, ?8 D7 c
# [1 J- |+ F8 \. [7 Y! j
error: #159:4.error: #159: declaration is incompatible with previous "wr_lcd" (declared at line 40)
' S: f1 h; O8 S* s描述:在wr_lcd函数还没有声明之前就已经使用了.多出现在两种情况:第一种,wr_lcd函数体还没有写,就已经用到了它,这种情况多出现在写一个程序的大体结构中,只是简单写一下框架.第二种情况比较常见,函数a调用函数b,但函数b的函数体在函数a的下面:% o! c0 M- w$ y4 _
void a(void) //函数a的实体
% B0 }" {7 T/ t$ b6 J) G{
2 r( B3 m+ Y& R6 Eb(); //调用函数b- B) {, i* ~% p
}
1 j0 m$ p( A/ R6 A
, T9 ^- A( Y2 E7 h# ^! Avoid b(void) //函数b的实体
9 }, f8 ?+ c9 m2 m& R% W; b{: ?7 h3 k/ r6 Y+ j/ u
...5 X$ W" _4 s, W0 L
}' J9 U* @( y) g9 |% V: E
这样如果点编译,就会产生error: #159的错误,因为当函数a调用函数b时,发现在这之前都没有函数b的任何声明.
8 }" ]* m- n+ O% X& E6 h解决方法:在函数a调用函数b之前,对函数b进行声明,如:2 P2 W. X- m( q8 t( }2 I' L0 @* `
void b(void); //对函数b进行声明
! P8 C( L& }2 \6 |- k, \

6 D/ K; T% j1 v; |1 E) M0 F& ~
void a(void) //函数a的实体
% i& ]% U3 i4 x7 W# r. W; V
{# {: {2 U8 `2 a/ S* @. Z9 T
b(); //调用函数b
5 k$ N% Q3 t# @7 t. \
}
, i( \0 E7 E- u( q; ^7 I9 |8 P0 C

) m& F, U: f* z. n# l
void b(void) //函数b的实体
3 e, g! w. p4 K2 X: b
{# R4 Y2 K4 U$ D( Z. L: E% \
...
. N+ _$ I1 F  M: w6 C
}- [2 k( M" m) z& ^% X4 ~) a, E) [4 C: U

4 k! y& Y5 b' _" jerror: #137:5. error: #137: expression must be a modifiable lvalue
  m3 o+ ^0 K- _) F# u4 Y# C. G! C! A2 |6 s% T$ J2 g
描述:表达式必须是一个可以修改的左值.主要出现在这种现象:
2 i5 c) b0 N( ]" T  T' c1 G) z0 o: ^: ]1 D9 A( H
a=NUM;
! O4 n+ ^& s* r. l$ T  K+ E4 X. u& _
NUM是一个数值或表达式,a为一个变量,但a被定义为像const这种不可更改的类型,导致NUM不能赋值给变量a.
2 z8 e: C; d& E  v2 s$ ]# Q9 m0 s( ]3 t# z# L  h/ |
解决方法:要么放弃赋值,要么修改变量属性.
1 l4 M# O! {# [, ~
6 C" e% a+ n) l$ j- g
error: #1113: 你的固件库里的库文件没有添加进工程里面,所以出现未定义的情况。; W+ K, f6 S9 q$ ~
TIM2_IRQChannel指定时器2的中断通道没有定义,其实在固件库对这些参数都有定义,宏定义代替了一串寄存器地址数据。需要将.C文件添加到工程文件中__asm放到一个单独的子函数再被调用就没问题了2 d) i- Z" p* ^
如下:4 e1 @6 i8 }2 V, c+ f
__asm void nop(void)
5 M) g; V% T$ I, @/ f* P
{3 f5 K' H* _. n5 S1 H
    NOP3 e, p7 i, P. B
}
: d+ l4 r3 k- ?0 \7 j
然后在之后的C代码中调用该函数:
9 }6 }; S. b+ h* y  Y
void main()4 a( [, v1 k3 A4 J% L
{
% z' e7 X) c  `/ H+ B3 M0 X: q
...
( Q2 J, ]8 r: X! F' ?% }. onop();, A2 [" J( {* W6 @
... 8 E1 s5 Z3 d$ b& s* {% \: |
}
  d, c: T" ~( U) c* Z) a
收藏 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
先留着
  k" }! Y. s7 N. n" d) Z
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 手机版