OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9917|回复: 3

原子哥,我对模块化编程用的不是太熟,有个问题想你帮我看一下。

[复制链接]

19

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2011-9-19
在线时间
8 小时
发表于 2011-10-19 14:18:04 | 显示全部楼层 |阅读模式

我现在刚刚开始使用模块化编程写程序,我这两天写了一个程序,上个帖子中把结构体变量的初始化问题解决了,但是解决后编译通过了,但链接出了问题,以下是报错的信息:
.\obj\拉力倾斜.axf: Error: L6200E: Symbol Message multiply defined (by adc_dma.o and sys_config.o).
.\obj\拉力倾斜.axf: Error: L6200E: Symbol Message multiply defined (by usart_485.o and sys_config.o).
.\obj\拉力倾斜.axf: Error: L6200E: Symbol Message multiply defined (by main.o and sys_config.o).
.\obj\拉力倾斜.axf: Error: L6200E: Symbol Message multiply defined (by stm32f10x_it.o and sys_config.o).
.\obj\拉力倾斜.axf: Error: L6200E: Symbol ADC_Value multiply defined (by adc_dma.o and sys_config.o).
.\obj\拉力倾斜.axf: Error: L6200E: Symbol ADC_Value multiply defined (by stm32f10x_it.o and sys_config.o).
.\obj\拉力倾斜.axf: Error: L6200E: Symbol ADDR_Flash multiply defined (by adc_dma.o and sys_config.o).
.\obj\拉力倾斜.axf: Error: L6200E: Symbol ADDR_Flash multiply defined (by usart_485.o and sys_config.o).
.\obj\拉力倾斜.axf: Error: L6200E: Symbol ADDR_Flash multiply defined (by main.o and sys_config.o).
.\obj\拉力倾斜.axf: Error: L6200E: Symbol ADDR_Flash multiply defined (by stm32f10x_it.o and sys_config.o).
.\obj\拉力倾斜.axf: Error: L6200E: Symbol VLDRange_Flash multiply defined (by adc_dma.o and sys_config.o).
.\obj\拉力倾斜.axf: Error: L6200E: Symbol VLDRange_Flash multiply defined (by usart_485.o and sys_config.o).
.\obj\拉力倾斜.axf: Error: L6200E: Symbol VLDRange_Flash multiply defined (by main.o and sys_config.o).
.\obj\拉力倾斜.axf: Error: L6200E: Symbol VLDRange_Flash multiply defined (by stm32f10x_it.o and sys_config.o).
.\obj\拉力倾斜.axf: Error: L6200E: Symbol Pitch_un multiply defined (by adc_dma.o and sys_config.o).
.\obj\拉力倾斜.axf: Error: L6200E: Symbol Pitch_un multiply defined (by stm32f10x_it.o and sys_config.o).
.\obj\拉力倾斜.axf: Error: L6200E: Symbol Roll_un multiply defined (by adc_dma.o and sys_config.o).
.\obj\拉力倾斜.axf: Error: L6200E: Symbol Roll_un multiply defined (by stm32f10x_it.o and sys_config.o).
.\obj\拉力倾斜.axf: Error: L6200E: Symbol VLD_un multiply defined (by adc_dma.o and sys_config.o).
.\obj\拉力倾斜.axf: Error: L6200E: Symbol VLD_un multiply defined (by stm32f10x_it.o and sys_config.o).
.\obj\拉力倾斜.axf: Error: L6200E: Symbol Vol_un multiply defined (by adc_dma.o and sys_config.o).
.\obj\拉力倾斜.axf: Error: L6200E: Symbol Vol_un multiply defined (by stm32f10x_it.o and sys_config.o).
.\obj\拉力倾斜.axf: Error: L6200E: Symbol Temperature_un multiply defined (by adc_dma.o and sys_config.o).
.\obj\拉力倾斜.axf: Error: L6200E: Symbol Temperature_un multiply defined (by stm32f10x_it.o and sys_config.o).
.\obj\拉力倾斜.axf: Error: L6200E: Symbol VLD_Range multiply defined (by adc_dma.o and sys_config.o).
.\obj\拉力倾斜.axf: Error: L6200E: Symbol VLD_Range multiply defined (by stm32f10x_it.o and sys_config.o).
上面报错信息中Message 变量是一个结构体变量,它放在sys_config.h这个头文件中,在adc_dma.c  usart_485.c  main.c  stm32f10x_it.c这四个源文件中用到了这个结构体变量;
ADC_Value  ADDR_Flash  VLD_Range  这几个变量也是在sys_config.h这个头文件中定义的;
Pitch_un  Roll_un  VLD_un  Vol_un  Temperature_un这几个是联合体变量,也是在sys_config.h这个头文件中定义的, VLD_Range也是定义在sys_config.h头文件中,
在其它的源文件中用到这些变量的时候我都包含了sys_config.h这个头文件,但是总说我重定义了,对模块化编程搞的不是太明白,不知道怎么改。
我好像记得模块化编程的时候定义在头文件中的全局变量在其它文件中是不是只要包含了头文件就可以用了呢?而且在KeilMDK中可以不用加extern,但是不知道为什么,我还是出现了这么多这样的错误

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164817
金钱
164817
注册时间
2010-12-1
在线时间
2098 小时
发表于 2011-10-19 14:38:38 | 显示全部楼层
回复【楼主位】baiydcwy:
---------------------------------
这种一般是你在头文件里面定义了u8/结构体之类的变量导致的问题.
解决办法是把这些定义放到.c文件.在.h文件里面使用extern来解决.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

19

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2011-9-19
在线时间
8 小时
 楼主| 发表于 2011-10-19 16:12:48 | 显示全部楼层
在头文件中不能定义u8/结构体之类的变量吗? 我们进行结构化编程的时候对于变量一般不是这样的吗:把其它文件模块要用的全局变量定义在头文件中,在需要使用的程序模块中包含这个头文件;而把其它文件中用不到而只有本程序模块中用到的全局变量定义在源文件中,供本程序模块使用,而且在使用的时候还可省掉extern这个修饰符。我在头文件中用了u8这类的,但是我包含了stm32f10x_lib.h这个头文件,我觉得应该不会出错的,但是还是报错,不知道原子哥能不能从原理上指导一下呢,非常感谢,呵呵
回复 支持 反对

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164817
金钱
164817
注册时间
2010-12-1
在线时间
2098 小时
发表于 2011-10-19 16:30:42 | 显示全部楼层
回复【3楼】baiydcwy:
---------------------------------
不能定义的!!
如果你在一个.h文件种有形如:u8 x=0;之类的语句.
如果只在一个.c文件中调用就没有问题.如果多个.c文件调用同一个.h文件,问题就来了.他会提示说:重复定义.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-3-29 07:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表