DirectShow--filter 开发 之 编译调试
2010-04-26 14:55
351 查看
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,删除,就可以正确编译了
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
用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没加上去 |
相关文章推荐
- DirectShow--filter 开发 之 程序调试
- Windows Embedded CE 6.0开发初体验(七)编译和调试平台
- C++ 用条件编译 控制开发过程中输出调试信息
- 利用 DirectShow 开发自己的 Filter
- Liferay 6.1开发学习(五):编译调试修改源码
- 利用 DirectShow 开发自己的 Filter
- Windows驱动程序开发基础(四)驱动的编译调试和安装
- Openfire源代码调试、编译开发环境
- 利用 DirectShow 开发自己的 Filter
- Windows驱动程序开发基础(四)驱动的编译调试和安装
- android NDK开发、编译、调试环境搭建与操作入门
- linux下集成开发环境之ECLIPSE--在线调试、编译程序
- 【Android Native Code开发系列】 五 运行、调试编译的Native Code项目
- DebugInfoFIlter -- DirectShow调试工具
- VS.net中DirectShow Filter调试方法!~
- Openfire源代码调试、编译开发环境
- 利用Directshow开发传输filter
- 【Directshow学习日记】(二) FilterTitleOverlay 编译的错误
- C++ 用条件编译 控制开发过程中输出调试信息
- Visual Studio Code开发Qt应用程序实现自动提示、语法高亮、代码导航、编译和调试