之前寫過一篇文章《VS2005(VC8)編譯Xalan-C_1_10_0》,主要是用“将wchar_t類型視為内置類型”的選項改為否。見下圖。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyRQpkL2kDM081MyIzN0gDNzMTMvwVOx8CX0AjMxAjMvw1ckF2bsBXdvwFdl5mLuR2cj5Set1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
這樣修改後,随之帶來的問題是,使用這個庫的工程(包括xerces)都需要做出同樣的修改。相當繁瑣。本文提出一種新的編譯Xalan的方法,無需改變wchar_t的選項。
文檔約定
$XercesSrcHome:指Xerces-C_2_8_0的源碼所在檔案夾
$XalanSrcHome:指Xalan-C_1_10_0的源碼所在檔案夾
步驟
(1)使用vs2005編譯Xerces-C_2_8_0
Xerces-C_2_8_0的VS2005解決方案在$XercesSrcHome\Projects\Win32\VC8\xerces-all檔案夾下。
(2)設定XERCESCROOT環境變量
建立XERCESCROOT環境變量,其值設定為Xerces-C_2_8_0源碼的根路徑,即$XercesSrcHome。
右鍵我的電腦\屬性\進階\環境變量
(3)設定VS2005開發環境的Xerces-C_2_8_0路徑
工具\選項\項目解決方案\VC++目錄,
添加“包含檔案”路徑:$XercesSrcHome\src
添加“庫檔案”:$XercesSrcHome\Build\Win32\VC8\Debug
(4)由于Xalan-C_1_10_0不提供VC8(VS2005)解決方案,但其提供了VS7.1(VS2003)的解決方案。是以需要将解決方案從VC7.1裝換為VC8。。
Xalan-C_1_10_0的VC7.1的解決方案位于$XalanSrcHome\c\Projects\Win32\VC7.1。将$XalanSrcHome\c\Projects\Win32\VC7.1檔案夾複制為$XalanSrcHome\c\Projects\Win32\VC8,然後用VS2005打開$XalanSrcHome\c\Projects\Win32\VC8\Xalan.sln,開發環境自動将工程轉換為VC8。
(5)編譯Localization工程
編譯Xalan庫之前,需要先編譯Localization工程。編譯過程中将會出現若幹錯誤,下文将逐個解決。
a)修改$XalanSrcHome\c\Projects\Win32\VC8\Utils\Localization\BuildMessages.mak檔案,在第一行處加入如下語句:
include tools.ini
并修改$XalanSrcHome\c\Projects\Win32\VC8\Utils\Localization\tools.ini,
将
[NMAKE]
CFG=Release
改為
#[NMAKE]
#CFG=Release
即注冊掉NMAKE段。
否則,會出現如下編譯錯誤:BuildMessages.mak(26) : fatal error U1050: Invalid configuration BITS="" specified.
b)修改$XalanSrcHome\c\Projects\Win32\VC8\Utils\MsgCreator\MsgCreator.mak檔案,修改debug的編譯選項,将/MLd改為/MDd。
将
CPP_PROJ=/nologo /MLd /W4 /Gm /GX /ZI /Od /I ".\\" /I $(XALANINCLUDE) $(XERCESINCLUDE) /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Fr"$(INTDIR)\\" /Fp"$(INTDIR)\MsgCreator.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c
修改為:
CPP_PROJ=/nologo /MDd /W4 /Gm /GX /ZI /Od /I ".\\" /I $(XALANINCLUDE) $(XERCESINCLUDE) /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Fr"$(INTDIR)\\" /Fp"$(INTDIR)\MsgCreator.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c
否則會出現如下連接配接錯誤:
MsgCreator.obj : error LNK2019: 無法解析的外部符号 __CrtSetReportFile,該符号在函數 _main 中被引用
1>MsgCreator.obj : error LNK2019: 無法解析的外部符号 __CrtSetReportMode,該符号在函數 _main 中被引用
1>MsgCreator.obj : error LNK2019: 無法解析的外部符号 __CrtSetDbgFlag,該符号在函數 _main 中被引用
1>libcpmtd.lib(xmbtowc.obj) : error LNK2001: 無法解析的外部符号 __CrtDbgReportW
1>SAX2Handler.obj : error LNK2019: 無法解析的外部符号 __CrtDbgReportW,該符号在函數 "public: char & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::operator[](unsigned int)" (??A?$basic_strin[email protected][email protected]@std@@[email protected]@2@@std@@[email protected]) 中被引用
1>libcpmtd.lib(cerr.obj) : error LNK2001: 無法解析的外部符号 __CrtDbgReportW
1>libcpmtd.lib(cout.obj) : error LNK2001: 無法解析的外部符号 __CrtDbgReportW
1>libcpmtd.lib(stdthrow.obj) : error LNK2001: 無法解析的外部符号 __CrtDbgReportW
1>libcpmtd.lib(xdebug.obj) : error LNK2019: 無法解析的外部符号 __malloc_dbg,該符号在函數 "void * __cdecl operator new(unsigned int,struct std::_DebugHeapTag_t const &,char *,int)" ([email protected][email protected]@@[email protected]) 中被引用
1>libcpmtd.lib(xmbtowc.obj) : error LNK2001: 無法解析的外部符号 __malloc_dbg
1>NMAKE : fatal error U1077:
1>libcpmtd.lib(xdebug.obj) : error LNK2019: 無法解析的外部符号 __free_dbg,該符号在函數 "void __cdecl operator delete(void *,struct std::_DebugHeapTag_t const &,char *,int)" ([email protected][email protected]@@[email protected]) 中被引用
1>libcpmtd.lib(xmbtowc.obj) : error LNK2001: 無法解析的外部符号 __free_dbg
1>Stop.
1>libcpmtd.lib(_tolower.obj) : error LNK2019: 無法解析的外部符号 __calloc_dbg,該符号在函數 __Getctype 中被引用
1>..\..\..\..\..\Build\Win32\VC7.1\Debug\MsgCreator.exe : fatal error LNK1120: 7 個無法解析的外部指令
c)修改$XalanSrcHome\c\Projects\Win32\VC8\Utils\Localization\BuildMessages.mak檔案,
将
XERCESPATH=$(XERCESCROOT)/bin;$(XERCESCROOT)\Build\Win32\VC7.1\Release;$(XERCESCROOT)\Build\Win32\VC7.1\Debug;$(XERCESCROOT)\Build\Win64\VC7.1\Release;$(XERCESCROOT)\Build\Win64\VC7.1\Debug
修改為:
XERCESPATH=$(XERCESCROOT)/bin;$(XERCESCROOT)\Build\Win32\VC8\Release;$(XERCESCROOT)\Build\Win32\VC8\Debug;$(XERCESCROOT)\Build\Win64\VC8\Release;$(XERCESCROOT)\Build\Win64\VC8\Debug
否則會出現如下連接配接錯誤:
1>NMAKE : fatal error U1077:
1>Stop.
1>Project : error PRJ0019: 工具從"正在執行生成檔案項目操作"
1>生成日志儲存在“file://f:\2-研發庫\xml\xslt\xml-xalan\c\Projects\Win32\VC8\Utils\Localization\BuildLog.htm”
1>Localization - 2 個錯誤,62 個警告
d)修改$XalanSrcHome\c\Projects\Win32\VC8\Utils\XalanMsgLib\XalanMsgLib.mak檔案,将Win32 Debug的增加XALAN_XALANMSGLIB_BUILD_DLL宏定義。方法如下:
将
!ELSEIF "$(CFG)" == "XalanMsgLib - Win32 Debug"的
CPP_PROJ=/nologo /MDd /W4 /Gm /GX /ZI /Od $(XERCESINCLUDE) /I "..\..\..\..\..\src" /I ".\$(BUILDRESDIR)\Nls\Include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "XALANMSGLIB_EXPORTS" /D "XALAN_USE_NATIVE_WCHAR_T" /D "XALAN_XALANMSGLIB_BUILD_DLL" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c
改為
CPP_PROJ=/nologo /MDd /W4 /Gm /GX /ZI /Od $(XERCESINCLUDE) /I "..\..\..\..\..\src" /I ".\$(BUILDRESDIR)\Nls\Include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "XALANMSGLIB_EXPORTS" /D "XALAN_XALANMSGLIB_BUILD_DLL" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c
(6)編譯AllInOne
a)修改AllInOne的工程屬性,從工程中排除XPathCAPI.cpp檔案。
改檔案有兩處包含,分别在工程檔案夾XPathCAPI和XalanTransformer中。
b)增加宏定義_HAS_ITERATOR_DEBUGGING=0
否則會出現如下編譯錯誤:
2>C:\Program Files\Microsoft Visual Studio 8\VC\include\xutility(1360) : error C2678: binary '<' : no operator found which takes a left-hand operand of type 'xalanc_1_10::XalanDequeIterator<XalanDequeTraits,XalanDeque>' (or there is no acceptable conversion)
2> with
2> [
2> XalanDequeTraits=xalanc_1_10::XalanDequeConstIteratorTraits<xalanc_1_10::NameSpace>,
2> XalanDeque=xalanc_1_10::XalanDeque<xalanc_1_10::NameSpace,xalanc_1_10::ConstructWithMemoryManagerTraits<xalanc_1_10::NameSpace>>
2> ]
c)增加宏定義 XALAN_USE_NATIVE_WCHAR_T
(7)編譯XalanExe(可選)
a)删除輸入庫largeint.lib
b)去掉XALAN_USE_WINDOWS_TIMING宏定義
将
#if defined(_MSC_VER) && !defined(_WIN64)
#define XALAN_USE_WINDOWS_TIMING
#endif
改為
#if defined(_MSC_VER) && !defined(_WIN64)
//#define XALAN_USE_WINDOWS_TIMING
#endif
否則會出現如下錯誤:
3>LINK : fatal error LNK1104: 無法打開檔案“largeint.lib”
參考文獻
a)http://marc.info/?l=xalan-c-users&m=113116861129527
b)http://lists.gnu.org/archive/html/make-w32/2004-03/msg00027.html
c)http://mail-archives.apache.org/mod_mbox/xml-xalan-c-users/201001.mbox/%[email protected]%3E
d)http://mail-archives.apache.org/mod_mbox/xml-xalan-c-users/200709.mbox/%[email protected]%3e
e)http://marc.info/?l=xalan-c-users&m=113215252420764