visual studio 2005下xvid的編譯

xvid-core-1.1.3在vs2005下面編譯。
1.
首先,在win平臺下面nasm.exe是不可少的,這個codec有太多的asm文件需要編譯了。
使用了0.98.35的版本(高於此版本的沒有成功)。下載它以後,我們需要把它放到系統目錄system32下(直接在項目中添加executable path也可以)。在我的機器上是E:/WINDOWS/system32
2.
原本的xvid-core1.1.2是專門爲了在vc6下面編譯的,所以那些工程文件
都是爲vc6準備的,到了vs2005,直接轉換後編譯無法通過。
我們會看到在xvid的build目錄下的win32有很多vc6工程文件:
libxvidcore.dsp
libxvidcore_static.dsp
xvid_bench.dsp
xvid_decraw.dsp
xvid_decraw_static.dsp
xvid_encraw.dsp
xvid_encraw_static.dsp
xvidcore.dsw
如果我們雙擊這個xvidcore.dsw,vs2005會提示你是否轉換工程到vs2005的版本。如果轉換了,面臨的結果就是編譯不過。
編譯不過的原因:
(1)dsp工程文件轉換到vs2005時候的bug,手工解決用文本編輯器打開libxvidcore.dsw,然後搜索"InputDir"
看到如下的內容:!IF  "$(CFG)" == "libxvidcore - Win32 Release"

# Begin Custom Build - Assembling $(InputPath)
InputDir=../../src/image/x86_asm
IntDir=./Release
InputPath=../../src/image/x86_asm/colorspace_rgb_mmx.asm
InputName=colorspace_rgb_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
經過轉換後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
問題解決方法是把上面代碼改爲:
!IF  "$(CFG)" == "libxvidcore - Win32 Release"

# Begin Custom Build - Assembling $(InputPath)
InputDir=../../src/image/x86_asm
IntDir=./Release
InputPath=../../src/image/x86_asm/colorspace_rgb_mmx.asm
InputName=colorspace_rgb_mmx

"$(IntDir)/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
  nasm -f win32 -DPREFIX -I$(InputDir) -o $(IntDir)/$(InputName).obj $(InputPath)
# End Custom Build
去掉引號和它後面的那個/即可。
同樣../../src/image/x86_asm/colorspace_yuv_mmx.asm, ../../src/image/x86_asm/colorspace_yuyv_mmx.asm以及這三個文件的debug版本都需要同樣的修改
雙擊xvidcore.dsw,執行轉換,就可以發現.asm文件都可以順利編譯了。
另外的解決方案是不修改dsw文件直接轉換成2005工程,在上述三個文件上點右鍵修改屬性爲nasm -f win32 -DPREFIX -I$(InputDir) -o $(IntDir)/$(InputName).obj $(InputPath)。

3.
接下來編譯出現錯誤:
error C2632: 'int' followed by 'int' is illegal
雙擊它,打開的文件是crtdefs.h文件,這裏的int followed by int是這句代碼引起的:
typedef _W64 int         intptr_t;
這裏的intptr_t由於已經在src/portab.h(77)中:
#if defined(ARCH_IS_32BIT)
#    define CACHE_LINE 64
#    define ptr_t uint32_t
#    define intptr_t int32_t //*****
#    if defined(_MSC_VER) && _MSC_VER >= 1300 && !defined(__INTEL_COMPILER)
#        include <stdarg.h>
#    else
#        define uintptr_t uint32_t
#    endif
#elif defined(ARCH_IS_64BIT)
intptr_t被定義了,xvid爲了移植方便所以定義了這個宏,此時編譯器解釋爲:
typedef _W64 int  int32_t ;
這樣,就是int followed by int出現的原因了。
簡單註釋掉#define intptr_t int32_t即可,或者修改如下
#if defined(ARCH_IS_32BIT)
#    define CACHE_LINE 64
#    define ptr_t uint32_t
#    define intptr_t int32_t
#    define _INTPTR_T_DEFINED //add this line, avoid redefination
#    if defined(_MSC_VER) && _MSC_VER >= 1300 && !defined(__INTEL_COMPILER)
#        include <stdarg.h>
#    else
#        define uintptr_t uint32_t
#    endif
#elif defined(ARCH_IS_64BIT)

這樣libxvidcore.dsw就可以順利編譯了
其他工程也可以順利完成編譯.
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章