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沒加上去 |