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

[复制链接]
 楼主| cruby 发表于 2007-7-18 22:19 | 显示全部楼层 |阅读模式
今天编程序时碰到一个奇怪的现象,编译时可以通过,但链接时出现一百多个错误,都是说某个寄存器出现重复定义,如:“&gt&gt&nbsp;symbol&nbsp;_EVBIMRC&nbsp;mltiply&nbsp;defined:&nbsp;D:CrubyDSP2000200707serial02Debugmain.obj&nbsp;and&nbsp;D:CrubyDSP2000200707serial02Debugserial.obj”<br /><br />可是我觉得奇怪,我头文件可都是做了预包含的处理啊,如:<br />#ifndef&nbsp;...<br />#define&nbsp;...<br />....<br />#endif<br />这样按理说不应该出现这种错误才对啊,为什么会有这种现象呢?<br />CCS怎么才能编译有多个C源文件的工程呢?<br /><br />下面是我工程的主要文件:<br />/******&nbsp;主文件&nbsp;main.c&nbsp;*****/<br />#include&nbsp;&quot;common.h&quot;<br />#include&nbsp;&quot;serial.h&quot;<br />int&nbsp;main()<br />{<br />.......<br />return&nbsp;0;<br />}<br />/*****&nbsp;End&nbsp;*******/<br /><br />/*****&nbsp;串口通信函数的实现&nbsp;serial.c&nbsp;*******/<br />#include&nbsp;&quot;serial.h&quot;<br />#include&nbsp;&quot;common.h&quot;<br /><br />void&nbsp;A()<br />{}<br />void&nbsp;B()<br />{}<br />......<br />/**********&nbsp;End&nbsp;*************************/<br /><br />/********&nbsp;serial.h&nbsp;********************/<br />#ifndef&nbsp;SERIAL_H<br />#define&nbsp;SERIAL_H<br /><br />#include&nbsp;&quot;common.h&quot;<br /><br />void&nbsp;A();<br />void&nbsp;B();<br />......<br /><br />#endif<br />/*********&nbsp;End&nbsp;******************************/<br /><br />/*********&nbsp;common.h&nbsp;********************/<br />#ifndef&nbsp;COMMON_H<br />#define&nbsp;COMMON_H<br /><br />#include&nbsp;&quot;DSP2407A.h&quot;&nbsp;//寄存器<br /><br />typedef&nbsp;unsigned&nbsp;int&nbsp;uint;<br />typedef&nbsp;unsigned&nbsp;char&nbsp;uchar;<br /><br />#endif<br />/*********&nbsp;End&nbsp;***********************/<br /><br />/*********&nbsp;DSP2407A.h&nbsp;**********/<br />#ifndef&nbsp;DSP2407A_H<br />#define&nbsp;DSP2407A_H<br /><br />volatile&nbsp;unsigned&nbsp;int&nbsp;*IMR=(volatile&nbsp;unsigned&nbsp;int&nbsp;*)0x0004;<br />volatile&nbsp;unsigned&nbsp;int&nbsp;*GREG=(volatile&nbsp;unsigned&nbsp;int&nbsp;*)0x0005;<br />................<br />#endif<br />/********&nbsp;End&nbsp;********************************/<br /><br />其中main.c和serial.c我是添加到工程项目中的source文件夹下的
tjsheep 发表于 2007-7-19 20:04 | 显示全部楼层

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

c语言太不过关了……<br /><br />volatile&nbsp;unsigned&nbsp;int&nbsp;*IMR=(volatile&nbsp;unsigned&nbsp;int&nbsp;*)0x0004;<br />volatile&nbsp;unsigned&nbsp;int&nbsp;*GREG=(volatile&nbsp;unsigned&nbsp;int&nbsp;*)0x0005;<br /><br /><br /><br />
mybao 发表于 2007-7-19 21:38 | 显示全部楼层

re

。。
 楼主| cruby 发表于 2007-7-19 22:16 | 显示全部楼层

文件件里不能定义?

问题不在这里吧,这个头文件我一直在用的~<br /><br />今天还在头文件里加了一个函数,也没出现什么问题~<br /><br />问题我已经解决了,主要是source里只加一个.c,把其它的包含进来就可以了,剩下的都不必改<br /><br />
tjsheep 发表于 2007-7-20 21:10 | 显示全部楼层

头文件里不应该定义

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

不清楚

不知道你说的是不是标准C,不过至少在CCS里是可以这样操作的,并通过编译运行,如果你不信的话我可以把源代码给你看看
SmartDSP 发表于 2007-7-21 07:28 | 显示全部楼层

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

  
tjsheep 发表于 2007-7-21 21:51 | 显示全部楼层

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

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

有道理

/**********************************************************<br />三年前的tms320f240的特殊寄存器定义是这种指针的定义办法,2年前的lf2407是采用define定义绝对地址的办法,而1年前的2812就是采用普通变量定义再配合cmd文件定位的办法。这个办法最好,因为指针办法浪费空间,而且绕了一个弯,有点脱裤子那个的意思,define办法的变量名其实是宏定义,用起来不太好看,而28的办法最好,就是标准的变量定义,完美极了……<br />**************************************************************/<br /><br />原来我用的一直是三年前的定义~<br /><br />另外,你说2812采用普通变量定义再配合cmd文件,我不知道指的是什么意思?能详细说明一下吗?我今天看过同学的2812头文件,发现里面有大量的结构体,不知道你说的是不是这个?
hotpower 发表于 2007-7-22 02:06 | 显示全部楼层

感觉还是结构指针好

  
zmbnj 发表于 2007-7-23 12:26 | 显示全部楼层

to tjsheep

小弟刚玩DSP,大哥能对"或者定义一般的变量再分配到特殊寄存器的位置上去"解释一下吗?最好举个例子!
mybao 发表于 2007-7-23 17:49 | 显示全部楼层

re

tjsheep 发表于 2007-8-5 21:55 | 显示全部楼层

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

这个可以很随意,然后在cmd文件中,把变量,定义到合适的memory和section里面就可以了,具体可以看下ti的csl例程
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

64

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

10

主题

64

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部