su-409464 发表于 2015-10-16 14:20:28

工程链接时 出现重复定义问题!!!!

请问一个头文件 定义报错问题

我自己定义了一个 wifi_uart.h 的文件, 文件中很多unsigned char和布尔变量要定义。

我调用了uin8_t和bool来定义, 如下:


[*]
[*]#ifndef _wifi_uart_H
[*]#define _wifi_uart_H
[*]
[*]#include "stm8s.h"
[*]/*************    本地变量声明    **************/
[*]uint8_t    RX1_Buffer;    //接收缓冲 idata
[*]uint8_t    TX1_Cnt;    //发送计数
[*]uint8_t    RX1_Cnt;    //接收计数
[*]bool    B_TX1_Busy;    //发送忙标志
[*]
[*]#endif

复制代码

因为uint8_t 是 在stm8s.h 中 定义的。

[*]/*!< Unsigned integer types*/
[*]typedef unsigned char   uint8_t;
[*]typedef unsigned short    uint16_t;
[*]typedef unsigned long   uint32_t;
[*]
[*]typedef enum {FALSE = 0, TRUE = !FALSE} bool;

复制代码

   所有我在 wifi_uart.h 中    添加了头文件#include "stm8s.h"

但是编译的的时候出现了 重复定义的错误:
   #error clnk Debug\smartsocket.lkf:58 Debug\wifi_uart.o: symbol _RX1_Buffer multiply defined (Debug\main.o)


   我把 wifi_uart.h 中    的 #include "stm8s.h"注释掉:
   编译的时候 却 显示了 一大堆缺少”;“的 错误,但实际是没有缺的

      #error cpstm8 inc\wifi_uart.h:20(0+7) missing ;

    我想 只把 下面句加到 wifi_uart.h 中
   编译的时候 也是报了 重复定义的错误!!!!

[*]/*!< Unsigned integer types */
[*]typedef unsigned char uint8_t;
[*]typedef unsigned short uint16_t;
[*]typedef unsigned long uint32_t;
[*]
[*]typedef enum {FALSE = 0, TRUE = !FALSE} bool;

复制代码


      请问具体是该如何处理?


最后我向苍天保证RX1_Buffer只在 wifi_uart.h中定义一次!!!!!! 苍天作证!!!!!

enjoyfreescal 发表于 2015-10-16 16:41:58

su-409464 发表于 2015-10-16 16:04
我终于明白你的意思了!!!!

”数据定义应该在.c文件中定义,在.h文件中声明“


不需要,最简单的方法,如我之前说的,可以定义一个.c文件专门定义变量,同时定义相应.h文件声明相应变量,然后其他.c都包含该.h文件即可(如同你的stm8s.h文件一样,导出都需要)

dsjsjf 发表于 2015-10-16 15:28:41

不要在头文件中定义变量

xuguomin 发表于 2015-10-16 14:47:59

如果stm8s.h 是总头文件 应该在 "stm8s.h"包含wifi_uart.h

enjoyfreescal 发表于 2015-10-16 14:30:04

上传工程看一下,还有就是数据定义应该在.c文件中定义,在.h文件中声明,否则多处调用.h会重复定义

enjoyfreescal 发表于 2015-10-16 14:36:29

在.h文件加关键字extern:
extern uint8_t    RX1_Buffer;

su-409464 发表于 2015-10-16 14:36:31

enjoyfreescal 发表于 2015-10-16 14:30
上传工程看一下,还有就是数据定义应该在.c文件中定义,在.h文件中声明,否则多处调用.h会重复定义 ...

但是有些数据 不单单 这个 wifi_uart.c 要用到。


我的想法是在wifi_uart.h 中 统一定义,   其他c 文件 要用到就调用一下 这个h 文件!!!


自己工程架构能力还是很差很不规范!!!

enjoyfreescal 发表于 2015-10-16 14:38:08

su-409464 发表于 2015-10-16 14:36
但是有些数据 不单单 这个 wifi_uart.c 要用到。




那你可以建立一个.c专门负责数据的创建,和一个.h负责相应声明,其他.c文件调用即可。

xuguomin 发表于 2015-10-16 14:44:55

不能包含 #include "stm8s.h"

enjoyfreescal 发表于 2015-10-16 14:46:00

本帖最后由 enjoyfreescal 于 2015-10-16 14:49 编辑

su-409464 发表于 2015-10-16 14:36
但是有些数据 不单单 这个 wifi_uart.c 要用到。



E:\测试\smartsocket_wifi\inc\wifi_sys.h:14:uint8_t      RX1_Buffer;      //接收缓冲 idata
E:\测试\smartsocket_wifi\inc\wifi_uart.h:18:uint8_t      RX1_Buffer;      //接收缓冲 idata
你重复定义了!!还有你#include "wifi_uart.h"这个在main.c和wifi_uart.c都调用了,所以RX1_Buffer;声明了两次

pwdzsj 发表于 2015-10-16 15:10:23

有时候编译器版本不一样也会出现这种情况:lol
页: [1] 2
查看完整版本: 工程链接时 出现重复定义问题!!!!