OpenEdv-开源电子网

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

有关外部变量的使用问题

[复制链接]

2

主题

6

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2015-5-27
在线时间
0 小时
发表于 2015-6-19 01:36:05 | 显示全部楼层 |阅读模式
5金钱
在usart.h里面定义了:
#define USART_REC_MAX 100
extern u8  USART_REC_BUFF[USART_REC_MAX];
extern u8  USART_RX_STATE;
extern u16 USART_RX_NUM;

在main.c里面加入了:
#include "usart.h"

在usart.c里面加入了:
#include "usart.h"

但是编译后还是会报错,如下:
.\Objects\main.axf: Error: L6218E: Undefined symbol USART_REC_BUFF (referred from main.o).
.\Objects\main.axf: Error: L6218E: Undefined symbol USART_RX_STATE (referred from main.o).
.\Objects\main.axf: Error: L6218E: Undefined symbol USART_RX_NUM (referred from usart.o).


编译环境是MDK5.14
请问这是什么鬼?

愚人不努力,懒人攀巅峰
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2015-5-14
在线时间
6 小时
发表于 2015-6-19 09:29:29 | 显示全部楼层
把extern去掉,我猜就好了吧。。。
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-6-19 10:05:57 | 显示全部楼层
添加路径了吗
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2015-5-27
在线时间
0 小时
 楼主| 发表于 2015-6-19 13:38:16 | 显示全部楼层
回复【3楼】龙之谷:
---------------------------------
加入了路径,这个是链接报错,不是编译报错。我找了这方面的资料看了下,估计问题就出来,我只对变量声明了,没对其进行定义,晚上回去后,在main.c里面对它们进行定义,再试试,现在在上班~~
愚人不努力,懒人攀巅峰
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2015-5-27
在线时间
0 小时
 楼主| 发表于 2015-6-19 13:39:30 | 显示全部楼层
回复【2楼】皮皮logo:
---------------------------------
可以试试~~
愚人不努力,懒人攀巅峰
回复

使用道具 举报

54

主题

1008

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2384
金钱
2384
注册时间
2012-11-22
在线时间
403 小时
发表于 2015-6-19 16:42:29 | 显示全部楼层
明显是没有定义,最好在"usart.c"里面定义,然后在其他文件中申明。
态度决定一切
回复

使用道具 举报

14

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
133
金钱
133
注册时间
2014-10-27
在线时间
23 小时
发表于 2015-6-19 17:05:15 | 显示全部楼层
项目文件夹project下有main.c、common.c和common.h三个文件,其中common.h文件分别#include在main.c和common.c文件中。现在希望声明一个字符型变量key,在main.c和common.c中公用,
   有人想,既然是想两个文件都用,那就在common.h中声明一个unsigned char key,然后由于包含关系,在main.c和common.c中都是可见的,所以就能共用了。
   但是实际写出来,我们发现编译的时候编译器提示出错,一般提示大概都类似于:Error: L6200E: Symbol key multiply defined (by common.o and main.o). 也就是说编译器认为我们重复定义了key这个变量。这是因为#include命令就是原封不同的把头文件中的内容搬到#include的位置,所以相当于main.c和common.c中都执行了一次unsigned char key,而C语言中全局变量是项目内(或者叫工程内)可见的,这样就造成了一个项目中两个变量key,编译器就认为是重复定义。
   正确的解决办法:使用extern关键字来声明变量为外部变量。具体说就是在其中一个c文件中定义一个全局变量key,然后在另一个要使用key这个变量的c文件中使用extern关键字声明一次,说明这个变量为外部变量,是在其他的c文件中定义的全局变量。
问渠哪得清如许 为有源头活水来
回复

使用道具 举报

14

主题

1592

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
2622
金钱
2622
注册时间
2014-7-17
在线时间
350 小时
发表于 2015-6-19 22:53:45 | 显示全部楼层
头文件加了没?
回复

使用道具 举报

4

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2015-10-10
在线时间
16 小时
发表于 2015-12-2 10:25:34 | 显示全部楼层
回复【7楼】Simon:
---------------------------------
如果有10个文件要用key这个变量,那么按你的办法需要在10个文件中都进行extern外部声明。我试过将外部声明放在一个文件时,但是不行,求指导。
回复

使用道具 举报

22

主题

213

帖子

0

精华

高级会员

Rank: 4

积分
682
金钱
682
注册时间
2015-2-13
在线时间
74 小时
发表于 2015-12-3 11:38:43 | 显示全部楼层
5楼说得对。

一般用法:.c 文件定义变量,.c 对应 .h 文件 extern 声明,其他文件要使用就包含 .h 头文件。

所有你还需要在 usart.c 中添加:
u8  USART_REC_BUFF[USART_REC_MAX];
u8  USART_RX_STATE;
u16 USART_RX_NUM;
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2021-12-1
在线时间
3 小时
发表于 2021-12-3 17:24:09 | 显示全部楼层
请问我已经按照10楼说的添加了,结果还是报错了,怎么办
回复

使用道具 举报

24

主题

119

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2601
金钱
2601
注册时间
2017-4-4
在线时间
343 小时
发表于 2021-12-3 18:51:20 | 显示全部楼层
定义和声明是不一样的,你这里的问题是只进行了变量的声明,并没有进行变量的定。你还需要在c文件中进行定义,在c文件中加入u8  USART_REC_BUFF[USART_REC_MAX];等内容
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-14 15:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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