天天看點

VS2005編譯DirectShow的問題與解決

安裝DXSDK 後, 使用VC60編譯生成strmbasd.lib等靜态庫都沒有問題, 但在VS2005下使用這些靜态庫時, 編譯不通過, 可能是由于編譯器不同的原

因吧.

是以, 要VS2005工程使用DirectShow上的靜态庫, 應該先使用VS2005生成這些靜态庫.

使用VS2005打開DXSDK下DirectShow的BaseClass的工程, 經過轉換進行編譯, 編譯報錯:

error C2146: 文法錯誤 : 缺少“;”(在辨別符“PVOID64”的前面)

問題說明:

用VS2005編譯DirectShow baseclasses的問題。

打開winnt.h檔案,發現問題就是在winnt.h頭檔案中無POINTER_64的定義造成的。

搜尋vc下的頭檔案,發現在basetsd.h頭檔案中有POINTER_64的定義,而在winnt.h頭檔案中也包含了該頭檔案。

而在dxsdk9中也有basetsd.h頭檔案,而該檔案無POINTER_64的定義,是以編譯通不過。調整頭檔案搜尋順序後,編譯也不行,

原來在VC6目錄裡也有basetsd.h頭檔案,而該檔案無POINTER_64的定義。可能因為VC6的Include目錄在系統變量include裡有,是以改變VS中的頭檔案搜尋順序不能解

決問題。

最後我吧winnt.h中的#include <basetsd.h>改成"basetsd.h"就可以了。

unresolved external symbol "int __stdcall lstrlenWInternal(wchar_t const *)" 缺乏lib或者 lib版本不正确

(引用: http://freedomszp.spaces.live.com/blog/cns!767067FF9841D7D1!187.entry)

修改後, 後面報的錯就隻是文法上的問題了, 這裡不說了.

// 比較詳細的說明

http://blog.csdn.net/bwmwm/archive/2009/04/24/4106522.aspx

從網上下了DirectX 9.0 SDK,運作裡面的的BaseClasses的時候出現了N多錯誤,在網上找到了相應的方法。就是上面那個連結啦,哈哈~~

   1. 編譯基類源代碼

   BaseClasses編譯生成

路徑:<DXSDK>/Samples/C++/DirectShow/BaseClasses

環境:VS2005

為了正确編譯,需修改以下檔案:

(a) ctlutil.h

D:/DXSDK/Samples/C++/DirectShow/BaseClasses/ctlutil.h

編譯時提示錯誤:

BaseClasses/ctlutil.h(278) : error C4430: 缺少類型說明符 - 假定為 int。注意: C++ 不支援預設 int

 修改:

    //operator=(LONG); //原代碼

    COARefTime& operator=(LONG);

     改完這個之後,出現一堆錯誤,一個一個來改。

(b) wxdebug.cpp

d:/DXSDK/Samples/C++/DirectShow/BaseClasses/wxdebug.cpp

錯誤:

1>./wxdebug.cpp(567) : error C4430: 缺少類型說明符 - 假定為 int。注意: C++ 不支援預設 int

改:

        //static g_dwLastRefresh = 0;

        static DWORD g_dwLastRefresh = 0; //lspmodify

(c) winutil.cpp

d:/DXSDK/Samples/C++/DirectShow/BaseClasses/winutil.cpp

錯誤:

1>./winutil.cpp(2104) : error C2065: “Count”: 未聲明的辨別符

改:

    //for (UINT  Count = 0;Count < Result;Count++) 

    UINT Count; //lspmodify

   for (Count = 0;Count < Result;Count++) { //lspmodify

(d) outputq.cpp

d:/DXSDK/Samples/C++/DirectShow/BaseClasses/outputq.cpp

錯誤:

1>./outputq.cpp(664) : error C2065: “iDone”: 未聲明的辨別符

改:

     //for (long  iDone = 0;

long iDone; //lspmodify

for (iDone = 0; //lspmodify

在DirectShow 8.0的SDK裡面就看到有下面的頭檔案,在我裝的是9.0的,沒有找到這些檔案。是以編譯的時候修改完上面的就可以通過了。但要是裝8.0的話就要修改了。

2、頭檔案修改

(a) winnt.h

d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/include/winnt.h

在該檔案頭部添加:

#define POINTER_64 __ptr64 // add by peter lee

(b) vmr9.h

D:/DXSDK/Include/vmr9.h

       MixerPref9_RenderTargetRGB      = 0x1000,

       MixerPref9_RenderTargetYUV      = 0x00002000, //lsp add

3、VS2005環境配置

在vs2005下,選擇菜單 Tools -> Options,左欄選擇Projects and Solutions -> VC++ Directories

在彈出的對話框的"Show directories for"(顯示以下内容的目錄)中選擇Include files(包含檔案):

- include:

<DXSDK>/Include

<DXSDK>/Samples/C++/Common/Include

<DXSDK>/Samples/C++/DirectShow/BaseClasses

<WMSDK>/WMFSDK9/include

...

再在"Show directories for"中選擇 Libraries files(庫檔案):

- lib:

<DXSDK>/lib

<DXSDK>/Samples/C++/Common/Src

<DXSDK>/Samples/C++/DirectShow/BaseClasses/Debug_Unicode

<DXSDK>/Samples/C++/DirectShow/BaseClasses/Release_Unicode

<WMSDK>/WMFSDK9/lib

修改完成啦,哈哈~~~編譯通過了~~ DirectX9.0 隻需要做第一步修改就可以了,但8.0就要三步都做完~~~暈倒~~