DirectShow–filter 開發 之 編譯調試

來源:互聯網
上載者:User

1用VC寫DLL中"error LNK2005: _DllMain@12 already defined"的應對

用Visual C++編寫DLL,如果在new project時選了MFC DLL,而後又想寫成Regular DLL,即擁有自己的DllMain()入口函數,則在build時會遇到類似如下的link錯誤:

 error LNK2005: _DllMain@12 already defined in xxx.OBJ

1, 你只需要在工程設定裡面[project   setting——C/C++——Preprocessor  ],把

WIN32,NDEBUG,_WINDOWS,_MBCS,_USRDLL,MSGBOX_EXPORTS,_WINDLL,_AFXDLL

中的_USRDLL,刪除,就可以正確編譯了

2

當 C 運行時 (CRT) 庫和 Microsoft 基礎類 (MFC) 庫的連結順序有誤時,可能會出現以下 LNK2005 錯誤之一:

LIBCMTD.lib(dbgheap.obj) : error LNK2005: _free already defined in msvcrtd.lib(MSVCRTD.dll)

解決方案:

因為MSVCRT.lib(MSVCRT.dll)是Dll不能Ignore它,應該Ignore的是libcmtd.lib  在Project->settings->Link中Category中選擇“input"選項在Ignore

 libraries 中將與MSVCRT.lib衝突的libcmtd.lib寫入就行了

3

nafxcwd.lib(appcore.obj) : error LNK2001: unresolved external symbol ___argv

nafxcwd.lib(appcore.obj) : error LNK2001: unresolved external symbol ___argc

nafxcwd.lib(timecore.obj) : error LNK2001: unresolved external symbol __mbctype

nafxcwd.lib(apphelp.obj) : error LNK2001: unresolved external symbol __mbctype

nafxcwd.lib(filelist.obj) : error LNK2001: unresolved external symbol __mbctype

解決方案:PROJECT->SETING->C/C++->PREPROCESSOR-> PREPROCESSOR definetions 中加入:_AFXDLL。

4     DEFINE_GUID  引起的錯誤

在filter開發中用到的 GUID如下:

DEFINE_GUID(CLSID_MPEG4_RECV,

                     0xfea98a1b, 0x6c08, 0x4acc, 0x9d, 0xa, 0xf2, 0xab, 0x52, 0xd8, 0x43, 0x7e);

 

DEFINE_GUID(XVID, 0x44495658, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71);//XDIV    xvid mpeg-4 codec

如是沒有在任何地方添加Initguid.h,你會得到一個連結錯誤:"unresolved external symbol."

  

 

 

如果同樣的GUID包含Initguid.h兩次,會得到編譯錯誤"redefinition; multiple initialization."

 

 

要解決這些問題,請確認Initguid.h只包含一次。注意:不要包含Initguid.h到先行編譯標頭檔中去,因為先行編譯標頭檔會被每個源檔案包含。

用DEFINE_GUID宏定義所需的GUID,全都放在比如myguid.h檔案裡;同時注意不要Initguid.h到myguid.h標頭檔中去。

解決方案:比如 我在CRecvOutPutPin :public CbaseOutputPin;

CMpeg4Filter:public CbaseFilter;

全域變數定義處

 

這三處用到了 myguid.h標頭檔

那麼只在Globals 處 #include 《initguid.h》

其他地方 不再包含此標頭檔 .

 5  error C2259: 'CMpeg4Filter' : cannot instantiate abstract class due to following members:

 由於CMpeg4Filter 繼承自CBaseFilter 而CBaseFilter 中還有純虛函數 如果在子類不把基類中所有 純虛函數每個都重寫否則CMpeg4Filter 就是抽象類別 不能執行個體化。

所以 在基類基礎上進行filter首先要 弄清基類中有哪些 純虛函數。

6

 

 

C++ Debug:fatal error C1083: Cannot open include file: 'streams.h': No such file or directo 

錯誤提示資訊:fatal error C1083: Cannot open include file: 'streams.h': No such file or directory

錯誤原因:找不到streams.h這個檔案

解決方案:

1) 安裝directX sdk
2)開啟安裝目錄下的dshow.dsw,進行編譯
3)在VC++的Tools/Option/Directory的Include和Library中分別加入
C:/DXSDK/Include
C:/DXSDK/SAMPLES/C++/DIRECTSHOW/BASECLASSES
C:/DXSDK/SAMPLES/C++/COMMON/INCLUDE

C:/DXSDK/Lib
C:/DXSDK/SAMPLES/C++/DIRECTSHOW/BASECLASSES/DEBUG
4)在編譯你工程前,在Project/Setting/Link/ 中加入 strmbasd.lib uuid.lib winmm.lib

7

我愛Divx 這個開源的

在寫這個MPEG4流的網路接收filter 時

在最開始 我用Xvid 解碼器 解碼接收到的 MPEG4標準流 然後在VMR9播放時 結果播放時全是亂碼

 

 

 

在排除了 丟包和 主要畫面格丟失(在filter 開發中造成 花屏的兩個最可能原因 對於MPEG4流 主要畫面格就是就是 I幀)後 我想到 在網路的發送端 因為我的視訊源是一個 .m4e檔案 (裡面是標準的MPEG4編碼流)後來我想到是解碼器的原因:.M4E封裝的格式和解碼器解碼不匹配造成的 在考慮到這些後 我 下載了 DivXInstaller 安裝後 我在GraphEdt裡調試時 在VMR9清晰流暢的播放。看來 Divx 通用性 強於 Xvid 嗎 ? 呵呵

8 在build dshow程式的時候出現error LNK2001: unresolved external symbol __imp__timeGetTime@0

出現這個僅僅是因為winmm,這個lib沒加上去

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.