OpenEdv-开源电子网

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

如何在工程中添加一个定义了全局变量的C文件,其中的变量在其他工程文件中可以调用?

[复制链接]

3

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2016-3-29
在线时间
6 小时
发表于 2018-1-20 16:33:15 | 显示全部楼层 |阅读模式
1金钱
小弟是一个新手,现在在研究MEMS器件,正好MPU6050有我想要的全部数据,所以最近在研究MPU6050。现在用F4开发板做开发。在工程中我新建并添加了一个GlobalVariable.c文件用来定义我想要用的全局变量,内容如下:
[mw_shl_code=c,true]//-------------- 通讯 -------------
struct COMM{
        unsigned int RX_Value[64];
        unsigned int RX_Buff[64];
        unsigned int TX_Value[64];
        unsigned int RX_Sign;
        unsigned int TX_Sign;
        unsigned int watchdog_count;
        unsigned int Err_count;
};

//------IMU-------
struct IMU{               
                short aacx,aacy,aacz;                //加速度传感器原始数据
                short gyrox,gyroy,gyroz;        //陀螺仪原始数据
                long axo,ayo,azo;                //加速度偏量
                long gxo,gyo,gzo;        //陀螺仪偏量
                float Velocity_X;        //x轴角速度
                float Velocity_Y;        //y轴角速度
                float Velocity_Z;        //z轴角速度
                float Acc_X;        //x轴加速度
                float Acc_Y;        //y轴加速度
                float Acc_Z;        //z轴加速度
                float Temperature;        //温度
                float pitch,roll,yaw;                 //欧拉角
                float Position_X,Position_Y,Position_Z;        //三轴角位置
};

struct SERVO_REGS{
//------------- 通讯 ------------
        struct IMU MUP6050;
        struct COMM COM1;
        //--时间计数器--
        int Timer_10K;
        int Timer_1K;
        int Timer_2;//2Hz计数器
        unsigned int Catch_times;
        unsigned int Delay_times;
        u8 gyro_buchang_flag;
};
struct SERVO_REGS ServoRegs;[/mw_shl_code]

之后再新建一个VariableDeclaration.h头文件用于声明我想用的变量,头文件代码如下:
[mw_shl_code=c,true]#include "sys.h"
#ifndef _VariableDeclaration_H
#define _VariableDeclaration_H

extern struct SERVO_REGS ServoRegs;

#endif        [/mw_shl_code]
在工程其他文件中引用这个头文件,于是出现了错误:

..\OBJ\MPU6050.axf: Error: L6218E: Undefined symbol ServoRegs (referred from main.o).


意思是说我没有定义ServoRegs这个变量。

请问各位大神,我错在了哪里,或者怎样才能实现我想要的这个功能。
因为所有变量都写在main.c文件里,要用的变量太多,实在是太乱。

最佳答案

查看完整内容[请看2#楼]

在其头文件加入全局变量定义,其他.c文件,添加这个头文件,即可调用了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-1-20 16:33:16 | 显示全部楼层
在其头文件加入全局变量定义,其他.c文件,添加这个头文件,即可调用了
回复

使用道具 举报

0

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
361
金钱
361
注册时间
2016-11-1
在线时间
119 小时
发表于 2018-1-20 16:49:24 | 显示全部楼层
你那个结构体ServoRegs的定义要放在.h文件中,.c文件中的ServoRegs的定义去掉
回复

使用道具 举报

3

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2016-3-29
在线时间
6 小时
 楼主| 发表于 2018-1-24 14:23:01 | 显示全部楼层
正点原子 发表于 2018-1-20 16:33
在其头文件加入全局变量定义,其他.c文件,添加这个头文件,即可调用了

[mw_shl_code=c,true]//###########################################################################
//
//         文件                :   
//
//         标题                :  伺服程序全局变量定义
//
//###########################################################################

#ifndef _VariableDeclaration_H
#define _VariableDeclaration_H
#include "sys.h"

//-------------- 通讯 -------------
struct COMM{
        unsigned int RX_Value[64];
        unsigned int RX_Buff[64];
        unsigned int TX_Value[64];
        unsigned int RX_Sign;
        unsigned int TX_Sign;
        unsigned int watchdog_count;
        unsigned int Err_count;
};

//------IMU-------
struct IMU{               
                short aacx,aacy,aacz;                //加速度传感器原始数据
                short gyrox,gyroy,gyroz;        //陀螺仪原始数据
                long axo,ayo,azo;                //加速度偏量
                long gxo,gyo,gzo;        //陀螺仪偏量
                float Velocity_X;        //x轴角速度
                float Velocity_Y;        //y轴角速度
                float Velocity_Z;        //z轴角速度
                float Acc_X;        //x轴加速度
                float Acc_Y;        //y轴加速度
                float Acc_Z;        //z轴加速度
                float Temperature;        //温度
                float pitch,roll,yaw;                 //欧拉角
                float Position_X,Position_Y,Position_Z;        //三轴角位置
};

struct SERVO_REGS{
//------------- 通讯 ------------
        struct IMU MUP6050;
        struct COMM COM1;
        //--时间计数器--
        int Timer_10K;
        int Timer_1K;
        int Timer_2;//2Hz计数器
        unsigned int Catch_times;
        unsigned int Delay_times;
        u8 gyro_buchang_flag;
};

extern struct SERVO_REGS ServoRegs;

#endif       

[/mw_shl_code]

都放到头文件里,依旧显示
..\OBJ\MPU6050.axf: Error: L6218E: Undefined symbol ServoRegs (referred from main.o).

若把最后的定义extern去掉改为    struct SERVO_REGS ServoRegs     就会提示
..\OBJ\MPU6050.axf: Error: L6200E: Symbol ServoRegs multiply defined (by userdefined.o and main.o).
..\OBJ\MPU6050.axf: Error: L6200E: Symbol ServoRegs multiply defined (by timer.o and main.o).


重复定义的错误
回复

使用道具 举报

0

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
361
金钱
361
注册时间
2016-11-1
在线时间
119 小时
发表于 2018-1-24 15:22:02 | 显示全部楼层
Jade_Lauvise 发表于 2018-1-24 14:23
[mw_shl_code=c,true]//###########################################################################
...

结构体的定义与结构体变量的声明放在同一个.h文件中,结构体变量在其中一个.c文件中定义,其它.c文件都include那个.h文件就可以了
回复

使用道具 举报

3

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2016-3-29
在线时间
6 小时
 楼主| 发表于 2018-1-24 15:50:10 | 显示全部楼层
Noctis 发表于 2018-1-24 15:22
结构体的定义与结构体变量的声明放在同一个.h文件中,结构体变量在其中一个.c文件中定义,其它.c文件都in ...

大侠能来个简单的例子吗?若是方便的话把你描述的.c和.h文件写个简单的例子发给我邮箱一份,不胜感激,liuyuzhang1988@126.com
回复

使用道具 举报

49

主题

341

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5265
金钱
5265
注册时间
2012-8-25
在线时间
1025 小时
发表于 2018-1-24 15:58:18 | 显示全部楼层
3文件  
main.c

#define  MAIN
#include  "data.h"



/////////

C1.c
#include  "data.h"

///////////
data.h

#ifdef MAIN
#define EXTERN   //定义变量
#else
#define EXTERN extern   //声明变量
#endif

EXTERN   char  a;


//////
#define  MAIN 只能在一个文件中

实体前加 EXTERN   

data.h中 其他 typedef  enum  什么的不要加 EXTERN   

数据不能给初始化值,上电回默认是 0








回复

使用道具 举报

3

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2016-3-29
在线时间
6 小时
 楼主| 发表于 2018-1-24 16:03:51 | 显示全部楼层

谢谢,我试一下
回复

使用道具 举报

3

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2016-3-29
在线时间
6 小时
 楼主| 发表于 2018-1-24 16:59:22 | 显示全部楼层

谢谢大侠的帮助,果然可以了,想问题提下大侠能详细介绍一下原理吗?extern,EXTERN,什么的,定义,声明什么的。。。。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-20 00:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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