chili
驱动牛犊
驱动牛犊
  • 注册日期2004-03-31
  • 最后登录2011-03-29
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:3654回复:3

怎么老提示重复定义?

楼主#
更多 发布于:2004-04-02 10:15
我是驱动开发新手,有个问题请教大家
开发环境:vc6.0/driverstudio3.0
我用driverstudio3.0向导生成一个ndis驱动,我在NdisFilterAdap.h中包含头文件<ntddk.h>、<wdm.h>等文件时(即使不写任何代码) 编译提示很多错误(如下),我查看了文件也没有发现什么地方重复定义的,请高手帮忙。

编译提示如下:
D:NTDDKincntdef.h(339) : error C2011: '_QUAD' : 'struct' type redefinition
D:NTDDKincntdef.h(649) : error C2011: '_LARGE_INTEGER' : 'union' type redefinition
D:NTDDKincntdef.h(668) : error C2011: '_ULARGE_INTEGER' : 'union' type redefinition
D:NTDDKincntdef.h(991) : error C2011: '_STRING' : 'struct' type redefinition
D:NTDDKincntdef.h(1011) : error C2011: '_CSTRING' : 'struct' type redefinition
D:NTDDKincntdef.h(1027) : error C2011: '_UNICODE_STRING' : 'struct' type redefinition
D:NTDDKincntdef.h(1057) : error C2011: '_LIST_ENTRY' : 'struct' type redefinition
D:NTDDKincntdef.h(1067) : error C2011: '_SINGLE_LIST_ENTRY' : 'struct' type redefinition
D:NTDDKincwdm.h(127) : error C2011: '_SLIST_HEADER' : 'union' type redefinition
D:NTDDKincwdm.h(190) : error C2011: '_MODE' : 'enum' type redefinition
D:NTDDKincwdm.h(335) : error C2011: '_KDPC_IMPORTANCE' : 'enum' type redefinition
D:NTDDKincwdm.h(345) : error C2011: '_KDPC' : 'struct' type redefinition
D:NTDDKincwdm.h(376) : error C2011: '_KIPI_COUNTS' : 'struct' type redefinition
D:NTDDKincwdm.h(427) : error C2011: '_MDL' : 'struct' type redefinition
....



[编辑 -  4/2/04 by  chili]
wwwxdmfive
驱动牛犊
驱动牛犊
  • 注册日期2002-07-19
  • 最后登录2005-07-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-04-02 17:39
这个问题我也碰到过。我同时包含ntifs.h和ntddk.h时也会报重复定义错误。原因是ntifs.h中定义了大部分ntddk.h中的宏和数据类型(一样的定义,但是不是全部ntddk中的内容),又定义了一些ntddk中没有定义的内容。这样同时包含的时候就会报重复定义的错误。如果程序中只需要使用公用的部分就只包含一个头就OK了。但是,有时候必须使用只在DDK中定义的冬冬,有时候有必须使用在冬冬。
对于这样的情况我是这样处理的:
  需要使用只在DDK中定义的函数的代码我将它单独放在一个或多个.c(.cpp)文件中,其本身及其所包含的.h文件都不能包含ntifs.h。其它的.c(.cpp)文件只包含ntifs.h.
你的情况我决得可以这样。将特定于ntddk的代码单独放在一些.c/.cpp文件中.定义一个接口(.h)给其它模块调用).
  方法比较烂,但是可行。
  
chili
驱动牛犊
驱动牛犊
  • 注册日期2004-03-31
  • 最后登录2011-03-29
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-04-02 18:04
非常感谢你的意见,我也试过那样做:自己定义一个文件包含所有重复定义的宏..,那样虽然能通过,但是那样以后类似的问题就很多了。比如我用到sting时 也出现同样问题string没定义,一包含<string>时又出现错误(如下),不知道v3.1版本有没有那个问题,不知道哪里有下载(www.google.com上查了半天都没搞到)
头晕啊

D:\NTDDK\inc\winnt.h(50) : warning C4005: 'MAX_NATURAL_ALIGNMENT' : macro redefinition
        D:\NTDDK\inc\ddk\ndis.h(107) : see previous definition of 'MAX_NATURAL_ALIGNMENT'
D:\NTDDK\inc\winnt.h(70) : warning C4005: 'PROBE_ALIGNMENT' : macro redefinition
        D:\NTDDK\inc\ddk\ndis.h(127) : see previous definition of 'PROBE_ALIGNMENT'
D:\NTDDK\inc\winnt.h(421) : error C2011: '_LARGE_INTEGER' : 'union' type redefinition
D:\NTDDK\inc\winnt.h(440) : error C2011: '_ULARGE_INTEGER' : 'union' type redefinition
D:\NTDDK\inc\winnt.h(718) : error C2011: '_LIST_ENTRY' : 'struct' type redefinition
D:\NTDDK\inc\winnt.h(728) : error C2011: '_SINGLE_LIST_ENTRY' : 'struct' type redefinition
D:\NTDDK\inc\winnt.h(1170) : warning C4005: 'STATUS_WAIT_0' : macro redefinition
        D:\NTDDK\inc\ntstatus.h(109) : see previous definition of 'STATUS_WAIT_0'
D:\NTDDK\inc\winnt.h(1171) : warning C4005: 'STATUS_ABANDONED_WAIT_0' : macro redefinition
        D:\NTDDK\inc\ntstatus.h(161) : see previous definition of 'STATUS_ABANDONED_WAIT_0'
D:\NTDDK\inc\winnt.h(1172) : warning C4005: 'STATUS_USER_APC' : macro redefinition
        D:\NTDDK\inc\ntstatus.h(184) : see previous definition of 'STATUS_USER_APC'
D:\NTDDK\inc\winnt.h(1173) : warning C4005: 'STATUS_TIMEOUT' : macro redefinition
        D:\NTDDK\inc\ntstatus.h(211) : see previous definition of 'STATUS_TIMEOUT'
D:\NTDDK\inc\winnt.h(1174) : warning C4005: 'STATUS_PENDING' : macro redefinition
        D:\NTDDK\inc\ntstatus.h(220) : see previous definition of 'STATUS_PENDING'
wwwxdmfive
驱动牛犊
驱动牛犊
  • 注册日期2002-07-19
  • 最后登录2005-07-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-04-05 19:07
我的建议是不用标准C++的类库和标准函数库。标准C++的类库是斤应用程序用的。
在驱动中使用DDK的Rtl函数来替代标准函数,使用DS的类库中的等价类来替换标准C++类库中的类。没有可替换的函数和类就自己实现相应的类。
 否则,即使编译通过,运行时也会有问题。
 当然,不是决定的。要区分那些标准库中的东西在驱动中可以使用不是一会能说清楚的。
 
游客

返回顶部