北京理工大学 20981班 陈罡
对于vc6.0环境下的编译方法,偶就借花献佛了见附件,偶直接把人家给翻译好的东东拿上来。
附件中的xvid-core-1.1.2是偶根据下面的操作,可以在vs2005下面编译的版本。
主要是起到备忘的作用,我主要讲讲在vs2005平台上面编译xvid-core的方法,
浪费了偶两个多小时,心疼ing...
首先,在win平台下面nasm.exe是不可少的,这个codec有太多的asm文件需要编译了。
方便起见偶放到附件里面了。下载它以后,我们需要把它放到vc的bin目录下面。在我的机器上是
D:\Program Files\Microsoft Visual Studio 8\VC\bin
好了,做到这里,第一步算是完成了。
下面就是非常让人苦恼的问题了,我自己感觉这是vs2005的bug。
原本的xvid-core1.1.2是专门为了在vc6下面编译的,所以那些工程文件
都是为vc6准备的,到了vs2005,连导出mak文件都没有了。我们必须从dsp文件开始下手。
进入:
D:\xvidcore-1.1.2\build\win32
我们会看到很多vc6工程文件:
2006-11-01 19:47 40,132 libxvidcore.dsp
2006-11-01 19:47 39,512 libxvidcore_static.dsp
2006-11-01 17:58 4,718 xvid_bench.dsp
2006-11-01 17:14 4,203 xvid_decraw.dsp
2006-11-01 17:46 4,900 xvid_decraw_static.dsp
2005-10-07 23:02 4,138 xvid_encraw.dsp
2006-11-01 17:45 4,666 xvid_encraw_static.dsp
2006-11-01 18:00 2,262 xvidcore.dsw
如果我们双击这个xvidcore.dsw,vs2005会提示你是否转换工程到
vs2005的版本。如果转换了,面临的结果就是铁定编译不过。
经过痛苦的追踪,我找到了编译不过的原因:
(1)dsp工程文件转换到vs2005时候的bug,手工解决
用ultraedit或者任何你喜欢的文本编辑器打开,然后搜索"InputDir"
你会看到如下的内容:
!IF "$(CFG)" == "libxvidcore - Win32 Release"
# Begin Custom Build - Assembling $(InputPath)
InputDir=..\..\src\image\x86_asm
IntDir=.\Release
InputPath=..\..\src\image\x86_asm\colorspace_yuyv_mmx.asm
InputName=colorspace_yuyv_mmx
"$(IntDir)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
nasm -f win32 -DPREFIX -I"$(InputDir)"\ -o $(IntDir)\$(InputName).obj $(InputPath)
# End Custom Build
这段就是没有修改之前的内容了,从上面的脚本看来,应该生成如下的编译命令:
nasm -f win32 -DPREFIX -I"..\..\src\image\x86_asm"\ -o .\Release\colorspace_yuyv_mmx.obj ..\..\src\image\x86_asm\colorspace_yuyv_mmx.asm
这个编译命令是可以单独编译生成.obj文件的,偶已经测试过。
但是经过转换后vs2005的转换结果是:
nasm -f win32 -DPREFIX -I"..\..\src\image\x86_asm\"\ -o .\Release\colorspace_yuyv_mmx.obj ..\..\src\image\x86_asm\colorspace_yuyv_mmx.asm
注意这里只是-I"..\..\src\image\x86_asm\"\莫名其妙的多了一个"\",nasm就会报告:
nasm: error: no input file specified
type `nasm -h' for help
所以,这个问题解决方法是把上面代码改为:
# Begin Custom Build - Assembling $(InputPath)
InputDir=..\..\src\image\x86_asm
IntDir=.\Release
InputPath=..\..\src\image\x86_asm\colorspace_yuyv_mmx.asm
InputName=colorspace_yuyv_mmx
"$(IntDir)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
nasm -f win32 -DPREFIX -I$(InputDir) -o $(IntDir)\$(InputName).obj $(InputPath)
# End Custom Build
去掉引号和它后面的那个\即可。
这个时候,你再双击xvidcore.dsw,执行转换,就可以发现.asm文件都可以顺利编译了。
但是在编译.c文件的时候,会出现一大堆警告,警告原因主要是使用了"非安全"的代码
比如scanf和sprintf之类的,编译器会建议你采用scanf_s和sprintf_s之类的安全替代
函数,只要简单忽略这些即可。
(2)修改源文件的定义
但是下面的错误,就让人头疼了:
error C2632: 'int' followed by 'int' is illegal
双击它,打开的文件竟然是crtdefs.h文件,系统的运行库怎么可能会出错?
原因肯定在代码里面。
这里的int followed by int是这句代码引起的:
typedef _W64 int intptr_t;
这里的intptr_t是不是由于已经被定义了,所以此时编译器解释为:
typedef _W64 int int ;
这样,就是int followed by int出现的原因了。
所以,再回头查看源代码:
我们在C:\xvidcore-1.1.2\src目录下面有一个# define intptr_t int32_t
呵呵,原来如此,xvid的作者已经定义了intptr_t了。这个定义和crtdefs.h文件
中的定义相冲突,因此,才导致了这个问题。
ok,简单注释掉即可。
现在重新编译一下,选择rebuild solution,呵呵,everything go on its way.
这些就是我在vc6编译成功的基础上在vs2005上编译该库的一点心得。
希望对大家有用。
|
文件: |
nasm.rar |
大小: |
114KB |
下载: |
下载 | |
|
文件: |
MPEG-4 Xvid VC6.0编译指南.rar |
大小: |
10KB |
下载: |
下载 | |
|
文件: |
xvidcore-1.1.2.rar |
大小: |
1082KB |
下载: |
下载 | |
阅读(6345) | 评论(2) | 转发(0) |