天天看点

VS2005编译T264总结

系统环境:

XP Professional sp3

Microsoft Visual C++ 2005   77626-009-0000007-41206

DirectX 9.0(9.0b) SDK Update - (Summer 2003)

第一步、编译T264.lib工程

1>------ Build started: Project: t264lib, Configuration: Debug Win32 ------

1>Performing Custom Build Step

1>'nasm' 不是内部或外部命令,也不是可运行的程序

1>或批处理文件。

1>Project : error PRJ0019: A tool returned an error code from "Performing Custom Build Step"

1>Build log was saved at "file://f:/PCI参考程序/t264-src-0.14/avc-src-0.14/avc/build/vc71/Debug/lib/BuildLog.htm"

1>t264lib - 1 error(s), 0 warning(s)

========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

安装了VVPP5.EXE弹出错误信息

试着安装vs6sp5.exe,安装完后提示重启计算机,再次编译t25lib工程,

1>------ Build started: Project: t264lib, Configuration: Debug Win32 ------

1>Performing Custom Build Step

1>'nasm' 不是内部或外部命令,也不是可运行的程序

1>或批处理文件。

1>Project : error PRJ0019: A tool returned an error code from "Performing Custom Build Step"

1>Build log was saved at "file://f:/PCI参考程序/t264-src-0.14/avc-src-0.14/avc/build/vc71/Debug/lib/BuildLog.htm"

1>t264lib - 1 error(s), 0 warning(s)

========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

在http://sourceforge.net/projects/nasm下载nasm-0.98.36-win32.rar:解压之后,把nasmw.exe重命名为nasm.exe,然后复制到D:/Program Files/Microsoft Visual Studio8/VC/Bin目录下,再次编译,通过。在/t264-src-0.14/avc-src-0.14/avc/build/bin目录下可以看到生成的t264libd.lib。备注:可以试试先跳过安装vs6sp5.exe这一步,待拷贝nasm.exe编译后出错再来安装vs6sp5.exe。

第二步、编译baseclasses

打开你的dx的sdk安装目录,例如:C:/DXSDK/Samples/C++/DirectShow/,这里就有一个叫baseclasses的工程,为安全起见,请先备份此工程。

1. 双击baseclasses.sln打开,提示我们需要转换工程,按提示转换就是了,编译提示错误:

1>D:/Microsoft Visual Studio 8/VC/PlatformSDK/include/winnt.h(222) : error C2146: syntax error : missing ';' before identifier 'PVOID64'

1>D:/Microsoft Visual Studio 8/VC/PlatformSDK/include/winnt.h(222) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

1>D:/Microsoft Visual Studio 8/VC/PlatformSDK/include/winnt.h(5940) : error C2146: syntax error : missing ';' before identifier 'Buffer'

1>D:/Microsoft Visual Studio 8/VC/PlatformSDK/include/winnt.h(5940) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

1>D:/Microsoft Visual Studio 8/VC/PlatformSDK/include/winnt.h(5940) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

1>d:/DX90SDK/Samples/C++/DirectShow/BaseClasses/ctlutil.h(278) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

在Tools->Options->Projects and solutions->vc++ directories->show directories for里选择include files然后增加

D:/DX90SDK/Include

D:/DX90SDK/Samples/C++/DirectShow/BaseClasses

D:/DX90SDK/Samples/C++/Common

可能会问题依旧,调整一下include files的顺序吧,把他们都放在最后,例如我的环境:

$(VCInstallDir)include

$(VCInstallDir)atlmfc/include

$(VCInstallDir)PlatformSDK/include

$(FrameworkSDKDir)include

D:/DX90SDK/Include

D:/DX90SDK/Samples/C++/DirectShow/BaseClasses

D:/DX90SDK/Samples/C++/Common

然后在project->BaseClasses properties->configuration->C/C++ -> General->Additional Include Directories里面的内容(.,../../../../include)删掉,重新编译,PVOID64的错误消失,原因如下:POINTER_64 是一个宏,在64位编译下起作用,它包含在SDK目录下的BASETSD.H中(Microsoft Visual Studio 8/VC/PlatformSDK/Include/basetsd.h(23):#define POINTER_64 __ptr64),但DXSDK自己也带了一个basetsd.h,里面没有定义POINTER_64,从而导致出错,只需要改变include files的优先级即可。当然,也可以改写winnt.h中的代码,在下面这两行:typedef  void  *PVOID; typedef  void *POINTER_64 PVOID64;之前增加一行:#define  POINTER_64   __ptr64。

2. 到目前为止,还剩下:BaseClasses/ctlutil.h(278) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int这个错误,解决方法如下:

打开project->BaseClasses properties->configuration->C/C++ ->Command Line,增加/wd4430选项。

3. 接着编译,提示error C2065: 'Count' : undeclared identifier等等错误,这个是微软的历史遗留问题了,C++标准语法的问题,因为在之前在for循环内定义的变量可以在for之外的地方使用,即在第一个for里for(int i,...),以后的for再使用i不必再声明,解决方法也很简单,打开project->BaseClasses properties->configuration->C/C++->Language->Force Comformance in For Loop Scrope设置为No即可。当然,也可以手动改代码,增加一个声明就是了。

经过上面几个步骤,应该是可以顺利编译了,对于其它版本的工程,照样设置就可以了,总共编译出下面4个文件备用:

BaseClasses/Debug/strmbasd.lib

BaseClasses/Debug_Unicode/strmbasd.lib

BaseClasses/Release/STRMBASE.lib

BaseClasses/Release_UnicodeSTRMBASE.lib

你或许需要在Tools->Options->Projects and solutions->vc++ directories->show directories for->library files里把它们加进去。

第三步、接下来编译dshow工程

1. 1>------ Build started: Project: dshow, Configuration: Debug Win32 ------

1>Compiling...

1>stdafx.cpp

1>f:/pci参考程序/t264-src-0.14/avc-src-0.14/avc/dshow/stdafx.h(12) : fatal error C1083: Cannot open include file: 'streams.h': No such file or directory

1>Build log was saved at "file://f:/PCI参考程序/t264-src-0.14/avc-src-0.14/avc/dshow/Debug/BuildLog.htm"

1>dshow - 1 error(s), 0 warning(s)

========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

这当然是添加头文件了,在Tools->Options->Projects and solutions->vc++ directories->show directories for里选择include files,环境如下:

$(VCInstallDir)include

$(VCInstallDir)atlmfc/include

$(VCInstallDir)PlatformSDK/include

$(FrameworkSDKDir)include

C:/DXSDK/Include

C:/DXSDK/Samples/C++/DirectShow/BaseClasses

C:/DXSDK/Samples/C++/Common

同时在Tools->Options->Projects and solutions->vc++ directories->show directories for里选择Library files添加选项,环境如下:

$(VCInstallDir)lib

$(VCInstallDir)atlmfc/lib

$(VCInstallDir)atlmfc/lib/i386

$(VCInstallDir)PlatformSDK/lib

$(FrameworkSDKDir)lib

$(VSInstallDir)

$(VSInstallDir)lib

C:/DXSDK/Lib

D:/Program Files/Microsoft Visual Studio/VC98/Lib,这里我曾试图改为D:/Program Files/Microsoft Visual Studio8/VC/Lib,结果提示找不到库文件,搜索了下,确实没有,不知道为什么VS2005下面为什么没有。

2. 编译

1>------ Build started: Project: dshow, Configuration: Debug Win32 ------

1>Compiling...

1>stdafx.cpp

1>c:/dxsdk/samples/c++/directshow/baseclasses/ctlutil.h(278) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

1>d:/program files/microsoft visual studio 8/vc/platformsdk/include/uuids.h : warning C4819: The file contains a character that cannot be represented in the current code page (936). Save the file in Unicode format to prevent data loss

1>Build log was saved at "file://f:/PCI参考程序/t264-src-0.14/avc-src-0.14/avc/dshow/Debug/BuildLog.htm"

1>dshow - 1 error(s), 1 warning(s)

========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

参见上文Baseclass设置,再次编译通过。这时可以通过GraphEdit在directshow Filters中看到多了T264Dec、T264Enc和T264Splitter。这样,就可以调试了。

期间碰到的问题

1. error LNK2001: unresolved symbol "public: virtual unsigned long __stdcallCBaseFilter::NonDelegatingRelease(void)"[email protected]@@UAGKXZ)

这个很明显是directshow库的问题,但是当时我们已经包含了strmbasd.Lib,也就没有注意到这个库到底对不对,后来在网上搜索了下,该库分为Debug、Debug_Unicode、Release和Release_Unicode四种,也就是前面提到的,改为C:/DXSDK/Samples/C++/DirectShow/BaseClasses/Debug/strmbasd.Lib就可以了,下次再出现这种链接不到的情况,可以多往这个方面想想。

2. 1>Linking...

1>   Creating library Debug/dshow.lib and object Debug/dshow.exp

1>Embedding manifest...

1>Performing registration

1>Project : error PRJ0019: A tool returned an error code from "Performing registration"

1>Build log was saved at "file://f:/PCI参考程序/t264-src-0.14/avc-src-0.14/avc/dshow/Debug/BuildLog.htm"

1>dshow - 1 error(s), 3 warning(s)

========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========

明明上一次编译成功了,之后又编译会出现这种情况,先Clean再编译,还是不行的话试试在Project/Properties/Configuration Properties/Linker/Command Line中添加/wd4430。再次编译通过。

参考资料:

1. wutong_login的专栏------菜鸟初学H.264--VC6下调试T264编解码器全过程

2. 我心飞翔(逸枫)的日志------DirectShow学习之一在vs2005中配置directshow开发环境