打印

keil模块化写程序出现问题

[复制链接]
4138|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xvezhe|  楼主 | 2014-5-6 09:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
第一次用KEIL模块化写程序,出现一下情况,请各位指点迷津

*** ERROR L104: MULTIPLE PUBLIC DEFINITIONS
    SYMBOL:  RYG_A
    MODULE:  whole_mode.obj (WHOLE_MODE)
*** ERROR L104: MULTIPLE PUBLIC DEFINITIONS
    SYMBOL:  SG_BLINK
    MODULE:  whole_mode.obj (WHOLE_MODE)
*** ERROR L104: MULTIPLE PUBLIC DEFINITIONS
    SYMBOL:  SG_START
    MODULE:  whole_mode.obj (WHOLE_MODE)
*** ERROR L104: MULTIPLE PUBLIC DEFINITIONS
    SYMBOL:  CNT_D
    MODULE:  whole_mode.obj (WHOLE_MODE)
*** ERROR L104: MULTIPLE PUBLIC DEFINITIONS
    SYMBOL:  CNT_C
    MODULE:  whole_mode.obj (WHOLE_MODE)
*** ERROR L104: MULTIPLE PUBLIC DEFINITIONS
    SYMBOL:  CNT_B
    MODULE:  whole_mode.obj (WHOLE_MODE)
*** ERROR L104: MULTIPLE PUBLIC DEFINITIONS
    SYMBOL:  NOWSTEPT
    MODULE:  whole_mode.obj (WHOLE_MODE)
*** ERROR L104: MULTIPLE PUBLIC DEFINITIONS
    SYMBOL:  CNT_A
    MODULE:  whole_mode.obj (WHOLE_MODE)
*** ERROR L104: MULTIPLE PUBLIC DEFINITIONS
    SYMBOL:  NEXTSTEP
    MODULE:  whole_mode.obj (WHOLE_MODE)
*** ERROR L104: MULTIPLE PUBLIC DEFINITIONS
    SYMBOL:  TAB
    MODULE:  whole_mode.obj (WHOLE_MODE)
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
    SEGMENT: ?CO?MAIN
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
    SEGMENT: ?PR?CHKRYG?BLSM
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
    SEGMENT: ?CO?BLSM
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
    SEGMENT: ?CO?WHOLE_MODE
Program Size: data=21.6 xdata=99 code=884
Target not created

相关帖子

沙发
ayb_ice| | 2014-5-6 10:24 | 只看该作者
多处定义了

使用特权

评论回复
板凳
xvezhe|  楼主 | 2014-5-6 10:45 | 只看该作者
ayb_ice 发表于 2014-5-6 10:24
多处定义了

我这里是把 函数变量全部放在一个头文件。。。,那个模块用到变量,直接调用变量头文件,若这样不行,因如何更改呢

使用特权

评论回复
地板
ningling_21| | 2014-5-6 10:46 | 只看该作者
xvezhe 发表于 2014-5-6 10:45
我这里是把 函数变量全部放在一个头文件。。。,那个模块用到变量,直接调用变量头文件,若这样不行,因 ...

定义只要一处就够了...

使用特权

评论回复
5
xvezhe|  楼主 | 2014-5-6 10:54 | 只看该作者
ningling_21 发表于 2014-5-6 10:46
定义只要一处就够了...

在一处定义,在其他C文件中需用的呢,因如何设置呢,请指教

使用特权

评论回复
6
diweo| | 2014-5-6 10:56 | 只看该作者
三天两头都有这种问题。怎么就那么不喜欢看书呢?随便哪本基础教程上都有吧。

使用特权

评论回复
7
xvezhe|  楼主 | 2014-5-6 10:59 | 只看该作者
ningling_21 发表于 2014-5-6 10:46
定义只要一处就够了...


#ifndef __BLSM_H__
#define __BLSM_H__

#include "reg52.h"       
#define uchar unsigned char
#define uint  unsigned  int

static bdata uchar adconin1;       
sbit adconin17 = adconin1^7;
sbit adconin16 = adconin1^6;  
sbit adconin15 = adconin1^5;
sbit adconin14 = adconin1^4;
sbit adconin13 = adconin1^3;
sbit adconin12 = adconin1^2;
sbit adconin11 = adconin1^1;
sbit adconin10 = adconin1^0;

static bdata uchar adconin2;       
sbit adconin27 = adconin2^7;
sbit adconin26 = adconin2^6;
sbit adconin25 = adconin2^5;
sbit adconin24 = adconin2^4;
sbit adconin23 = adconin2^3;
sbit adconin22 = adconin2^2;
sbit adconin21 = adconin2^1;
sbit adconin20 = adconin2^0;
sbit CHK_01        = P1^1;               
sbit CHK_02 = P1^2;   
sbit CHK_03        = P1^7;               

sbit JUMP_01= P1^3;               
sbit JUMP_02= P1^4;               
sbit JUMP_03= P1^5;               
sbit JUMP_04= P1^6;               

sbit COLOR_R= P3^7;     
sbit COLOR_G= P3^6;     

bit  SG_01,SG_02,SG_03,SG_04;                                                                  
bit  SG_PLAY;               
bit  SG_Start,SG_fault,SG_blink;
bit  pulse_sign;       
bit  yellow_bit;       
bit  ONE_phase_bit;       
bit  tt;                       
bit  timer_bit;               
bit  phase_bit;               
bit  SG_A,SG_B,SG_C,SG_D;                  
uchar  CNT_A,CNT_B,CNT_C,CNT_D;   
uchar  CNT_DJS;                                             
uchar  NOWSTEP;                       
uchar  NOWSTEPT;                   
uchar  ONESTEP;                       
uchar  ONESTEPT;                   
uchar  MARK_DATA;                  
uchar  time_dat;                                       
uchar  RYG_A;                           
uchar  RYG_B;
uchar  NEXTSTEP;          
uchar  ZEROTSTEP;                       
uchar  step;                               
uchar  phase_num;                       
uchar  TIME_num2,TIME_num3;       
uchar  Signal_1,Signal_2;       
uchar  dat_bug[12];                                                                                                                                                                                                  
code uchar  tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};  
extern void sysinit(void);
extern void CHKRYG(void);
extern void GETCOLOR(void);
#endif



以上为函数变量定义,因每个模块C文件都用到以上的变量,所以我把所有的变量放在一个头文件里面。。。想请教,若每个模块C文件用到以上的变量,因如何更改。。。

使用特权

评论回复
8
xvezhe|  楼主 | 2014-5-6 11:01 | 只看该作者
diweo 发表于 2014-5-6 10:56
三天两头都有这种问题。怎么就那么不喜欢看书呢?随便哪本基础教程上都有吧。 ...

手头没这方面的书籍。。。若有的话,也不必麻烦各位了。。。:$

使用特权

评论回复
9
ayb_ice| | 2014-5-6 11:04 | 只看该作者
这都是基本功而已

最简单的方法在C中定义,在H中声明

使用特权

评论回复
10
ningling_21| | 2014-5-6 11:04 | 只看该作者
本帖最后由 ningling_21 于 2014-5-6 11:06 编辑
xvezhe 发表于 2014-5-6 10:54
在一处定义,在其他C文件中需用的呢,因如何设置呢,请指教
在C文件中定义
在头文件中 声明一下为全局变量就可以了...

使用特权

评论回复
11
nbldelnan| | 2014-5-6 11:14 | 只看该作者
在.c文件里定义的变量,在.h文件中加extern声明

使用特权

评论回复
12
xlsbz| | 2014-5-6 12:33 | 只看该作者
百度 keil   MULTIPLE PUBLIC DEFINITIONS,  就出来答案了

使用特权

评论回复
13
xvezhe|  楼主 | 2014-5-6 14:03 | 只看该作者
nbldelnan 发表于 2014-5-6 11:14
在.c文件里定义的变量,在.h文件中加extern声明

每个C文件都要定义变量吗?在C文件的。h文件中声明吗? 比如说,uint a,b,c,d,  在A.c文件中定义uint a,b,c,d, 再次在A.h文件中加extern声明,extern uint a,b,c,d;  在B.c文件定义uint a,b,c,d; , 再次在B.h文件中加extern声明,extern uint a,b,c,d; 是这样的吗?

使用特权

评论回复
14
nbldelnan| | 2014-5-6 14:21 | 只看该作者
本帖最后由 nbldelnan 于 2014-5-6 14:23 编辑
xvezhe 发表于 2014-5-6 14:03
每个C文件都要定义变量吗?在C文件的。h文件中声明吗? 比如说,uint a,b,c,d,  在A.c文件中定义uint a,b ...

是的,为了防止重复包含在.h文件中添加以下
#ifndef XXXX
#define XXXX
需要声明的变量和函数

#endif

使用特权

评论回复
15
ballack_linux| | 2014-5-6 14:31 | 只看该作者
很好处理,如下:
在A.C中定义变量,如int i;
然后在A.H中声明该变量,如extern int i;
然后在要使用该变量的文件中包含以下A.H,如在B.C中加入#include "A.H"
注意,A.H格式如下,否则会引起重复包含
#ifndef _A_H_
#define _A_H_
...
#endif

使用特权

评论回复
16
天风立马| | 2014-5-6 17:27 | 只看该作者
nbldelnan
他回答的你看懂了.问题就解决了.

使用特权

评论回复
17
NE5532| | 2014-5-6 17:31 | 只看该作者
纠正一下,楼主这个不叫“模块化”写程序,叫“多文件”写程序,分成多个文件,不代表模块化做好了,模块化了,在一个文件里也可以搞定。

使用特权

评论回复
18
lmx89| | 2014-5-6 20:11 | 只看该作者
建议可以看些模块化编程的视频,在自己琢磨下。而且这问题一般百度上都有

使用特权

评论回复
19
hgjinwei| | 2014-5-6 22:29 | 只看该作者
那么强的耦合,这充其量也只能叫多文件编译,还称不上模块化啊。

使用特权

评论回复
20
叶伤| | 2014-5-9 10:20 | 只看该作者
多文件要注意#include的顺序,比如display.h里面需要用到value.h的变量,就需要在main.c里面这样写:

#include "value.h"
#include "display.h"

这样后面出现的display就能引用在他前面的value里的变量包括函数。

也可以用extern定义为外部变量,让keil自己去找。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

54

主题

225

帖子

2

粉丝