您的位置:首页 > 其它

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,删除,就可以正确编译了

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: