SDK中Sample編譯錯誤及其解決方案
SDK中Sample的編譯環境
如果使用Microsoft Visual Studio 2005,在工具->選項->項目和解決方案->vc++目錄中進行如下設置。
可執行文件:
D:\Program Files\Microsoft Visual Studio 8\VC
D:\Program Files\Microsoft Visual Studio 8\VC\redist\Debug_NonRedist\x86
\Microsoft.VC80.DebugMFC
D:\Program Files\Microsoft Visual Studio 8\VC\lib
D:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib
D:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\include
D:\Program Files\Microsoft Visual Studio 8\VC\include
D:\DXSDK\Lib
D:\DXSDK\Bin
D:\DXSDK\Samples\C++\DirectShow\BaseClasses
D:\DXSDK\Samples\C++\Common\Include
D:\DXSDK\Include
包含文件:
D:\Program Files\Microsoft Visual Studio 8\VC\include
D:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\include
D:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Include
D:\DXSDK\Include
D:\DXSDK\Samples\C++\DirectShow\BaseClasses
D:\DXSDK\Samples\C++\Common\Include
庫文件:
D:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Lib
D:\Program Files\Microsoft Visual Studio 8\VC\lib
D:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib
D:\Program Files\Microsoft Visual Studio 8\VC
D:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\include\i386
D:\DXSDK\Lib
D:\DXSDK\Samples\C++\DirectShow\BaseClasses\Debug
D:\DXSDK\Samples\C++\DirectShow\BaseClasses\Release
D:\DXSDK\Samples\C++\DirectShow\BaseClasses
1針對編譯DXSDK\Samples\c++\Direct3D時出現的錯誤,進行解析。
錯誤例子:
CVTRES : fatal error CVT1100: 重復的資源。type:MANIFEST, name:1, language:0×0409
LINK : fatal error LNK1123: 轉換到COFF 期間失敗: 文件無效或損壞
解決方案:
我的編譯環境是Microsoft Visual Studio 2005
將所有工程的屬性(工程全選->右擊->屬性)->配置屬性->清單工具->輸入輸出->嵌入清單,選擇“否”,然后編譯,就OK了。
2針對出現未聲明標識符的錯誤進行解析。
錯誤例子:for( m=0; m<pDevice->dwNumModes; m++ )
{
if( pDevice->modes[m].Width==640 && pDevice->modes[m].Height==480 )
{
error C2065: “m”: 未聲明的標識符
像這種錯誤,你可以查找它的定義,在將它的定義復制到錯誤行的前面。如上述例子中,你可以在for的上一行添加long m;。就可以了。
3針對出現無法初始化問題的錯誤進行解析。
錯誤例子:
TCHAR* strLastSlash = _tcsrchr( str, TEXT(‘\\’) )
錯誤:error C2440: “初始化”: 無法從“const wchar_t *”轉換為“TCHAR *”
像這樣的錯誤,你可以在=的右邊進行強制轉換。如下:
TCHAR* strLastSlash = (TCHAR*)_tcsrchr( str, TEXT(‘\\’) );
4針對警告被視為錯誤的問題進行解析。
錯誤例子:
c:\dxsdk\samples\c++\misc\dxdiagreport\dxdiaginfo.cpp(322) : error C2220: 警告被視為錯誤- 沒有生成“object”文件。
這種錯誤的原因是:原因是該文件的代碼頁為英文,而我們系統中的代碼頁為中文。
解決方案:啟動Microsoft Visual Studio 2005,文件->打開->選擇c:\dxsdk\samples\c++\misc\dxdiagreport\dxdiaginfo.cpp,然后保存。從新打開程序文件運行,此錯誤不再出現。
如果上述不能去掉錯誤,還可以點擊項目,右擊選擇屬性->配置屬性->c/c++->常規,將“警告視為錯誤”的選項改為“否”。就可以!
5編譯BaseClasses
正在編譯…
dllentry.cpp
D:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Include\winnt.h(222) : error C2146: 語法錯誤: 缺少“;”(在標識符“PVOID64”的前面)
D:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Include\winnt.h(222) : error C4430: 缺少類型說明符- 假定為int。注意: C++ 不支持默認int
D:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Include\winnt.h(5940) : error C2146: 語法錯誤: 缺少“;”(在標識符“Buffer”的前面)
D:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Include\winnt.h(5940) : error C4430: 缺少類型說明符- 假定為int。注意: C++ 不支持默認int
D:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Include\winnt.h(5940) : error C4430: 缺少類型說明符- 假定為int。注意: C++ 不支持默認int
D:\DXSDK\Include\uuids.h : warning C4819: 該文件包含不能在當前代碼頁(936)中表示的字符。請將該文件保存為Unicode 格式以防止數據丟失
生成日志保存在“file://d:\BaseClasses\Debug_Unicode\BuildLog.htm”
BaseClasses - 5 個錯誤,個警告
出現錯誤的地方:
typedef void *PVOID;
typedef void * POINTER_64 PVOID64;
更改:
#define POINTER_64 __ptr64///////gai
typedef void *PVOID;
typedef void * POINTER_64 PVOID64;////
錯誤:.\wxdebug.cpp(567) : error C4430: 缺少類型說明符- 假定為int。注意: C++ 不支持默認int
錯誤地方:static g_dwLastRefresh = 0;
修改:static int g_dwLastRefresh = 0;
6編譯Capture,無法打開libci.lib
出現錯誤:LINK : fatal error LNK1104: 無法打開文件“libci.lib”
生成日志保存在“file://d:\DXSDK\Samples\C++\DirectShow\Capture\CaptureTex\Debug\BuildLog.htm”
CaptureTex - 1 個錯誤,個警告
錯誤原因:缺少數據庫LIBCI.LIB在2003和2005中已經不存在了
解決方案:將庫文件指向VC6中的庫文件。
編譯Capture
出現錯誤:LINK : fatal error LNK1104: 無法打開文件“libci.lib”
生成日志保存在“file://d:\DXSDK\Samples\C++\DirectShow\Capture\CaptureTex\Debug\BuildLog.htm”
CaptureTex - 1 個錯誤,個警告
錯誤原因:缺少數據庫LIBCI.LIB在2003和2005中已經不存在了
編譯DMODEMO
錯誤:
..\..\..\Common\Src\dsutil.cpp(686) : error C2065: “i”: 未聲明的標識符
錯誤的地方:
if( i != m_dwNumBuffers )
return m_apDSBuffer[ i ];
else
return m_apDSBuffer[ rand() % m_dwNumBuffers ];
更改:在前面添加 unsigned char i;
編譯DMOSAMPLE
d:\DXSDK\include\dmoimpl.h(622) : error C2065: “dw”: 未聲明的標識符
d:\DXSDK\include\dmoimpl.h(588): 編譯類模板成員函數“HRESULT IMediaObjectImpl<_DERIVED_,NUMBEROFINPUTS,NUMBEROFOUTPUTS>::ProcessOutput(DWORD,DWORD,DMO_OUTPUT_DATA_BUFFER *,DWORD *)”時
with
[
_DERIVED_=CSample,
NUMBEROFINPUTS=1,
NUMBEROFOUTPUTS=2
]
d:\dxsdk\samples\c++\directshow\dmo\dmosample\Sample.h(21): 參見對正在編譯的類模板實例化“IMediaObjectImpl<_DERIVED_,NUMBEROFINPUTS,NUMBEROFOUTPUTS>”的引用
with
[
_DERIVED_=CSample,
NUMBEROFINPUTS=1,
NUMBEROFOUTPUTS=2
]
d:\DXSDK\include\dmoimpl.h(623) : error C2228: “.dwStatus”的左邊必須有類/結構/聯合
d:\DXSDK\include\dmoimpl.h(624) : error C2228: “.fIncomplete”的左邊必須有類/結構/聯合
d:\DXSDK\include\dmoimpl.h(626) : error C2228: “.fIncomplete”的左邊必須有類/結構/聯合
sample.cpp
d:\DXSDK\include\uuids.h : warning C4819: 該文件包含不能在當前代碼頁(936)中表示的字符。請將該文件保存為Unicode 格式以防止數據丟失
d:\DXSDK\include\dmoimpl.h(622) : error C2065: “dw”: 未聲明的標識符
d:\DXSDK\include\dmoimpl.h(588): 編譯類模板成員函數“HRESULT IMediaObjectImpl<_DERIVED_,NUMBEROFINPUTS,NUMBEROFOUTPUTS>::ProcessOutput(DWORD,DWORD,DMO_OUTPUT_DATA_BUFFER *,DWORD *)”時
with
[
_DERIVED_=CSample,
NUMBEROFINPUTS=1,
NUMBEROFOUTPUTS=2
]
d:\dxsdk\samples\c++\directshow\dmo\dmosample\Sample.h(21): 參見對正在編譯的類模板實例化“IMediaObjectImpl<_DERIVED_,NUMBEROFINPUTS,NUMBEROFOUTPUTS>”的引用
with
[
_DERIVED_=CSample,
NUMBEROFINPUTS=1,
NUMBEROFOUTPUTS=2
]
d:\DXSDK\include\dmoimpl.h(623) : error C2228: “.dwStatus”的左邊必須有類/結構/聯合
d:\DXSDK\include\dmoimpl.h(624) : error C2228: “.fIncomplete”的左邊必須有類/結構/聯合
d:\DXSDK\include\dmoimpl.h(626) : error C2228: “.fIncomplete”的左邊必須有類/結構/聯合
state.cpp
StdAfx.cpp
util.cpp
正在生成代碼…
生成日志保存在“file://d:\DXSDK\Samples\C++\DirectShow\DMO\DMOSample\Debug_Unicode\BuildLog.htm”
dmosample - 8 個錯誤,個警告
========== 生成: 0 已成功, 1 已失敗, 0 最新, 0 已跳過==========
更改:在出錯的語句前加上DWORD_PTR dw;
編譯PlayDVD
正在鏈接…
PlayDVD.obj : error LNK2001: 無法解析的外部符號“unsigned int (__stdcall* ATL::g_pfnGetThreadACP)(void)” (?g_pfnGetThreadACP@ATL@@3P6GIXZA)
.\Debug_Unicode/PlayDVD.exe : fatal error LNK1120: 1 個無法解析的外部命令
生成日志保存在“file://d:\DXSDK\Samples\C++\DirectShow\DVD\PlayDVD\Debug_Unicode\BuildLog.htm”
PlayDVD - 2 個錯誤,個警告
========== 全部重新生成: 0 已成功, 1 已失敗, 0 已跳過==========
編譯DVD
錯誤:
PlayDVD.obj : error LNK2001: 無法解析的外部符號“unsigned int (__stdcall* ATL::g_pfnGetThreadACP)(void)” (?g_pfnGetThreadACP@ATL@@3P6GIXZA)
.\Debug/PlayDVD.exe : fatal error LNK1120: 1 個無法解析的外部命令
生成日志保存在“file://d:\DXSDK\Samples\C++\DirectShow\DVD\PlayDVD\Debug\BuildLog.htm”
PlayDVD - 2 個錯誤,個警告
========== 生成: 1 已成功, 1 已失敗, 0 最新, 0 已跳過==========
無法解決
編譯Editing
錯誤:xmltltst.cpp
d:\DXSDK\include\uuids.h : warning C4819: 該文件包含不能在當前代碼頁(936)中表示的字符。請將該文件保存為Unicode 格式以防止數據丟失
.\xmltltst.cpp(291) : error C2065: “k”: 未聲明的標識符
.\xmltltst.cpp(304) : error C2065: “j”: 未聲明的標識符
生成日志保存在“file://d:\DXSDK\Samples\C++\DirectShow\Editing\XTLTest\Debug_Unicode\BuildLog.htm”
XTLTest - 2 個錯誤,個警告
========== 生成: 6 已成功, 1 已失敗, 1 最新, 0 已跳過==========
更改:添加unsigned long k = 0 ;
unsigned long j = 0 ;
編譯PlayWndASF
錯誤:
playwndasf.obj : error LNK2001: 無法解析的外部符號“unsigned int (__stdcall* ATL::g_pfnGetThreadACP)(void)” (?g_pfnGetThreadACP@ATL@@3P6GIXZA)
urllaunch.obj : error LNK2001: 無法解析的外部符號“unsigned int (__stdcall* ATL::g_pfnGetThreadACP)(void)” (?g_pfnGetThreadACP@ATL@@3P6GIXZA)
.\Debug_Unicode/PlayWndASF.exe : fatal error LNK1120: 1 個無法解析的外部命令
生成日志保存在“file://d:\DXSDK\Samples\C++\DirectShow\Players\PlayWndASF\Debug_Unicode\BuildLog.htm”
PlayWndASF - 3 個錯誤,個警告
========== 全部重新生成: 1 已成功, 1 已失敗, 0 已跳過==========
更改:
向數據庫依賴項中添加atlsd.lib
編譯demos(D:\DXSDK\Samples\C++\Demos)
錯誤:
StdAfx.cpp
d:\program files\microsoft directx sdk (april 2007)\include\d3d9types.h(1385) : warning C4819: 該文件包含不能在當前代碼頁(936)中表示的字符。請將該文件保存為Unicode 格式以防止數據丟失
d:\DXSDK\Samples\C++\common\include\D3DFile.h(56) : error C2061: 語法錯誤: 標識符“LPDIRECTXFILEDATA”
d:\DXSDK\Samples\C++\common\include\D3DFile.h(111) : error C2061: 語法錯誤: 標識符“LPDIRECTXFILEDATA”
d:\DXSDK\Samples\C++\common\include\D3DFile.h(113) : error C2061: 語法錯誤: 標識符“LPDIRECTXFILEDATA”
生成日志保存在“file://d:\DXSDK\Samples\C++\Demos\Donuts4\Debug\BuildLog.htm”
Donuts4 - 3 個錯誤,個警告
========== 全部重新生成: 0 已成功, 1 已失敗, 0 已跳過==========
更改:在dsdfile.h的頂部加入#include <dxfile.h>就可以
再次編譯出現錯誤:
.\..\Common\Src\d3dfile.cpp(151) : error C2664: “D3DXLoadMeshFromXof”: 不能將參數1 從“LPDIRECTXFILEDATA”轉換為“LPD3DXFILEDATA”
與指向的類型無關;轉換要求reinterpret_cast、C 樣式轉換或函數樣式轉換
錯誤出處:
if( FAILED( hr = D3DXLoadMeshFromXof( pFileData, D3DXMESH_SYSTEMMEM, pd3dDevice,
&pAdjacencyBuffer, &pMtrlBuffer, NULL,
&m_dwNumMaterials, &m_pSysMemMesh ) ) )
更改:
if( FAILED( hr = D3DXLoadMeshFromXof((LPD3DXFILEDATA)pFileData, D3DXMESH_SYSTEMMEM, pd3dDevice,
&pAdjacencyBuffer, &pMtrlBuffer, NULL,
&m_dwNumMaterials, &m_pSysMemMesh ) ) )
編譯d3d
編譯dxtex
錯誤:
.\dxtexdoc.cpp(694) : error C2440: “初始化”: 無法從“const char *”轉換為“TCHAR *”
轉換丟失限定符
.\dxtexdoc.cpp(6 : error C2440: “初始化”: 無法從“const char *”轉換為“TCHAR *”
轉換丟失限定符
dxtexview.cpp
WINVER not defined. Defaulting to 0×0502 (Windows Server 2003)
d:\program files\microsoft directx sdk (april 2007)\include\d3d9types.h(1385) : warning C4819: 該文件包含不能在當前代碼頁(936)中表示的字符。請將該文件保存為Unicode 格式以防止數據丟失
MainFrm.cpp
WINVER not defined. Defaulting to 0×0502 (Windows Server 2003)
d:\program files\microsoft directx sdk (april 2007)\include\d3d9types.h(1385) : warning C4819: 該文件包含不能在當前代碼頁(936)中表示的字符。請將該文件保存為Unicode 格式以防止數據丟失
StdAfx.cpp
WINVER not defined. Defaulting to 0×0502 (Windows Server 2003)
d:\program files\microsoft directx sdk (april 2007)\include\d3d9types.h(1385) : warning C4819: 該文件包含不能在當前代碼頁(936)中表示的字符。請將該文件保存為Unicode 格式以防止數據丟失
正在生成代碼…
正在創建瀏覽信息文件…
Microsoft ?????????? Version 8.00.50727
Copyright (C) Microsoft Corporation. All rights reserved.
生成日志保存在“file://d:\DXSDK\Samples\C++\Direct3D\DXTex\Debug\BuildLog.htm”
dxtex - 2 個錯誤,個警告
========== 生成: 0 已成功, 1 已失敗, 0 最新, 0 已跳過==========
錯誤地方: TCHAR* pszLeaf = strrchr(lpszPathName, ‘\\’);
更改:TCHAR* pszLeaf = (TCHAR*)strrchr(lpszPathName, ‘\\’);
編譯后出現錯誤:
正在鏈接…
CVTRES : fatal error CVT1100: 重復的資源。type:MANIFEST, name:1, language:0×0409
LINK : fatal error LNK1123: 轉換到COFF 期間失敗: 文件無效或損壞
更改:
將在Debug模式下編譯改為Release模式下編譯。
編譯Water(water.cpp)錯誤:
.\Water.cpp(7 : error C2039: “Pass”: 不是“ID3DXEffect”的成員
更改: 直接去掉這句// m_pEffect->Pass(uPass)
\fur.cpp(424) : error C2039: “Pass”: 不是“ID3DXEffect”的成員
d:\program files\microsoft directx sdk (april 2007)\include\d3dx9effect.h(316) : 參見“ID3DXEffect”的聲明
.\fur.cpp(550) : error C2039: “Pass”: 不是“ID3DXEffect”的成員
d:\program files\microsoft directx sdk (april 2007)\include\d3dx9effect.h(316) : 參見“ID3DXEffect”的聲明
.\fur.cpp(567) : error C2039: “Pass”: 不是“ID3DXEffect”的成員
d:\program files\microsoft directx sdk (april 2007)\include\d3dx9effect.h(316) : 參見“ID3DXEffect”的聲明
.\fur.cpp(585) : error C2039: “Pass”: 不是“ID3DXEffect”的成員
d:\program files\microsoft directx sdk (april 2007)\include\d3dx9effect.h(316) : 參見“ID3DXEffect”的聲明
dxutil.cpp
更改:將Pass改成小寫pass。在Water編譯中也是錯誤的!!!
編譯VertexBlend(vertexblend.cpp)
錯誤:\vertexblend.cpp(312) : error C2065: “i”: 未聲明的標識符
.\vertexblend.cpp(315) : error C2228: “.v”的左邊必須有類/結構/聯合
.\vertexblend.cpp(315) : error C2228: “.x”的左邊必須有類/結構/聯合
.\vertexblend.cpp(316) : error C2228: “.blend”的左邊必須有類/結構/聯合
改正:for( INT i=0; i<dwNumVertices; i++ )
{
// Set the blend factors for the vertices
FLOAT a = ( pVertices[i].v.x - fMinX ) / ( fMaxX - fMinX );
pVertices[i].blend = 1.0f-sinf(a*D3DX_PI*1.0f);
}///INT
問題②
c:\Program Files\DXSDK\Extras\DirectShow\Samples\C++\DirectShow\BaseClasses\ctlutil.h(278) : error C4430: 缺少類型說明符- 假定為int。注意: C++ 不支持默認int
COARefTime(LONG);
operator=(LONG);
解決方案:改為
COARefTime(LONG);
int operator=(LONG);
Activex 使用DirectShow的問題解決方案
下面的編譯問題:
strmbasd.lib(dllentry.obj) : error LNK2001: unresolved external symbol "class CFactoryTemplate * g_Templates" (?g_Templates@@3PAVCFactoryTemplate@@A)
strmbasd.lib(dllentry.obj) : error LNK2001: unresolved external symbol "int g_cTemplates" (?g_cTemplates@@3HA)
解決方法:
在xxxctrl.h中加入下面的代碼
/////////////////////////////////////////////////////////////////////////////
// DllGetClassObject
extern "C"
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
return AfxDllGetClassObject(rclsid, riid, ppv);
}
/////////////////////////////////////////////////////////////////////////////
// DllCanUnloadNow
extern "C"
STDAPI DllCanUnloadNow(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
return AfxDllCanUnloadNow();
}
////////////////////////////////////////