打印

头文件重复包含?不可能吧,明明我已经.....

[复制链接]
3113|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cruby|  楼主 | 2007-7-18 22:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今天编程序时碰到一个奇怪的现象,编译时可以通过,但链接时出现一百多个错误,都是说某个寄存器出现重复定义,如:“>> symbol _EVBIMRC mltiply defined: D:CrubyDSP2000200707serial02Debugmain.obj and D:CrubyDSP2000200707serial02Debugserial.obj”

可是我觉得奇怪,我头文件可都是做了预包含的处理啊,如:
#ifndef ...
#define ...
....
#endif
这样按理说不应该出现这种错误才对啊,为什么会有这种现象呢?
CCS怎么才能编译有多个C源文件的工程呢?

下面是我工程的主要文件:
/****** 主文件 main.c *****/
#include "common.h"
#include "serial.h"
int main()
{
.......
return 0;
}
/***** End *******/

/***** 串口通信函数的实现 serial.c *******/
#include "serial.h"
#include "common.h"

void A()
{}
void B()
{}
......
/********** End *************************/

/******** serial.h ********************/
#ifndef SERIAL_H
#define SERIAL_H

#include "common.h"

void A();
void B();
......

#endif
/********* End ******************************/

/********* common.h ********************/
#ifndef COMMON_H
#define COMMON_H

#include "DSP2407A.h" //寄存器

typedef unsigned int uint;
typedef unsigned char uchar;

#endif
/********* End ***********************/

/********* DSP2407A.h **********/
#ifndef DSP2407A_H
#define DSP2407A_H

volatile unsigned int *IMR=(volatile unsigned int *)0x0004;
volatile unsigned int *GREG=(volatile unsigned int *)0x0005;
................
#endif
/******** End ********************************/

其中main.c和serial.c我是添加到工程项目中的source文件夹下的

相关帖子

沙发
tjsheep| | 2007-7-19 20:04 | 只看该作者

老大,你的头文件里是定义,不是声明,服了你了

c语言太不过关了……

volatile unsigned int *IMR=(volatile unsigned int *)0x0004;
volatile unsigned int *GREG=(volatile unsigned int *)0x0005;



使用特权

评论回复
板凳
mybao| | 2007-7-19 21:38 | 只看该作者

re

。。

使用特权

评论回复
地板
cruby|  楼主 | 2007-7-19 22:16 | 只看该作者

文件件里不能定义?

问题不在这里吧,这个头文件我一直在用的~

今天还在头文件里加了一个函数,也没出现什么问题~

问题我已经解决了,主要是source里只加一个.c,把其它的包含进来就可以了,剩下的都不必改

使用特权

评论回复
5
tjsheep| | 2007-7-20 21:10 | 只看该作者

头文件里不应该定义

定义是实际的空间分配过程,在头文件中应该是声明,用来指示编译器外部变量的关系。你应该在头文件中声明extern volatile unsigned int *IMR; 然后在一个集中的c文件中定义volatile unsigned int *IMR=(volatile unsigned int *)0x0004;而且你的这个定义并不好,你是另外定义了一个指针用来指向特殊寄存器,而特殊寄存器本身可以直接访问的。而我们一般都是用define直接定义绝对地址,或者定义一般的变量再分配到特殊寄存器的位置上去,呵呵,你好好琢磨琢磨哦

使用特权

评论回复
6
cruby|  楼主 | 2007-7-20 22:19 | 只看该作者

不清楚

不知道你说的是不是标准C,不过至少在CCS里是可以这样操作的,并通过编译运行,如果你不信的话我可以把源代码给你看看

使用特权

评论回复
7
SmartDSP| | 2007-7-21 07:28 | 只看该作者

tjsheep说得很正确,lz还是按标准C写程序吧

使用特权

评论回复
8
tjsheep| | 2007-7-21 21:51 | 只看该作者

呵呵,6楼,我没有不信,我只是说你的方法不好

用指针是我最初的方法,后来早就不用了,我说的当然是标准c,唯一有点特殊的就是利用cmd文件分配变量的位置,而且我可以告诉你,三年前的tms320f240的特殊寄存器定义是这种指针的定义办法,2年前的lf2407是采用define定义绝对地址的办法,而1年前的2812就是采用普通变量定义再配合cmd文件定位的办法。这个办法最好,因为指针办法浪费空间,而且绕了一个弯,有点脱裤子那个的意思,define办法的变量名其实是宏定义,用起来不太好看,而28的办法最好,就是标准的变量定义,完美极了……

使用特权

评论回复
9
cruby|  楼主 | 2007-7-21 22:40 | 只看该作者

有道理

/**********************************************************
三年前的tms320f240的特殊寄存器定义是这种指针的定义办法,2年前的lf2407是采用define定义绝对地址的办法,而1年前的2812就是采用普通变量定义再配合cmd文件定位的办法。这个办法最好,因为指针办法浪费空间,而且绕了一个弯,有点脱裤子那个的意思,define办法的变量名其实是宏定义,用起来不太好看,而28的办法最好,就是标准的变量定义,完美极了……
**************************************************************/

原来我用的一直是三年前的定义~

另外,你说2812采用普通变量定义再配合cmd文件,我不知道指的是什么意思?能详细说明一下吗?我今天看过同学的2812头文件,发现里面有大量的结构体,不知道你说的是不是这个?

使用特权

评论回复
10
hotpower| | 2007-7-22 02:06 | 只看该作者

感觉还是结构指针好

使用特权

评论回复
11
zmbnj| | 2007-7-23 12:26 | 只看该作者

to tjsheep

小弟刚玩DSP,大哥能对"或者定义一般的变量再分配到特殊寄存器的位置上去"解释一下吗?最好举个例子!

使用特权

评论回复
12
mybao| | 2007-7-23 17:49 | 只看该作者

re

使用特权

评论回复
13
tjsheep| | 2007-8-5 21:55 | 只看该作者

to 9楼和11楼, 呵呵,就是先定义合适的变量

这个可以很随意,然后在cmd文件中,把变量,定义到合适的memory和section里面就可以了,具体可以看下ti的csl例程

使用特权

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

本版积分规则

10

主题

64

帖子

0

粉丝