VS2008编译DirectX SDK BaseClasses时的问题(Zz)

九月 15th, 2010 发表评论 阅读评论

在编译DirectX下的BaseClasses的时候,遇到了一些错误,参考了网上很多文章,都说是要调整Include Directories的顺序,调整之后问题依旧,于是参考了这篇文章,终于搞定。

一. 设置INCLUDE及LIB目录

在把dxsdk中提供的baseclass编译通过后,用四种方式编译,会分别生成四个lib,一般只用到了其中的Debug和Release文件,在tool|option|vc++ directories中包含的files中设置如下。

这里需要加入得include files有四种:

D:\SDK\DXSDK\Include

D:\SDK\DXSDK\Samples\C++\DirectShow\BaseClasses

D:\SDK\DXSDK\Samples\C++\DirectShow\Common

D:\SDK\DXSDK\Samples\C++\Common\Include (这里可能是Common)

在后边的library files中也需要增加三到四种的文件:

D:\SDK\DXSDK\Lib

D:\SDK\DXSDK\Samples\C++\DirectShow\BaseClasses\Debug (基类编译前,这两个可以不设置)

D:\SDK\DXSDK\Samples\C++\DirectShow\BaseClasses\Release

二. 编译BaseClasses基类

本人使用的是VS2008,要使用DirectShow进行编程,需要对环境进行必要的配置。对dssdk中的baseclass.sln进行编译,生成需要的debug和release文件,具体步骤如下:

在VS6中,安装DirectShow9c版本之后,直接打开BaseClass中的Vc6工程baseclasses.dsw文件,直接编译即可,编译Debug Release Debug_Unicode ; ; Release_Unicode四个版本,都需要进行额外的设置(头文件或者链接库目录设置)。

DirectShow的BaseClass中已经带了工程文件baseclasses.sln,在vs2008中打开此文件,提示你进行必要的工程转换,转换之后开始编译,编译过程一般会出现下面三个问题:

(1)C:\Program Files\Microsoft Visual Studio 9\VC\PlatformSDK\include\winnt.h(222) :error C2146: syntax error : missing ';' before identifier 'PVOID64'

(2)error C4430: missing type specifier - int assumed. Note: C++ does not supportdefault-int

(3)error C2065: 'Count' : undeclared identifier

第一类问题的解决:project->BaseClasses properties->configuration->C/C++ -> General->Additional Include Directories里面的内容(.,..\..\..\..\include)删掉,重新编译,PVOID64的错误消失,原因如下:

POINTER_64 是一个宏,在64位编译下起作用,它包含在SDK目录下的BASETSD.H中(Microsoft Visual Studio 8\VC\PlatformSDK\Include\basetsd.h(23):#define POINTER_64 __ptr64),但DXSDK自己也带了一个basetsd.h,里面没有定义POINTER_64,从而导致出错,只需要改变includefiles的优先级即可。。当然,也可以改写winnt.h中的代码,将

typedef void *PVOID;

typedef void * POINTER_64 PVOID64;

改成

typedef void *PVOID;

typedef void * POINTER_64;

typedef void * PVOID64;

第二类问题的解决:错误发生在:operator=(LONG);函数定义中,这是因为在VC6中,如果没有显示的指定返回值类型,编译器将其视为默认整形;但是vs2005不支持默认整形,解决这个问题不能修改每个没有显示指示返回值类型的函数地方,可以用wd4430来解决;具体的在工程选项中的c++/Command Line中添加/wd4430即可。

第三个错误发生在for循环中,vc6中for循环中定义的变量相当于在for外面定义,可以在for之外地方使用;但是vs2005for循环中定义变量相当于域{}变量,只能在for循环中使用。要解决这个问题,可以通过修改vs2005的工程选项:”Project Option” --– “ C++ ” —--“Language” --- “Force Comformance in For Loop Scrope” 设置为No即可。

分类: 标签: DirectX  DirectShow