天天看点

VS2005(VC8)编译Xalan-C_1_10_0(更好的方法)

之前写过一篇文章《VS2005(VC8)编译Xalan-C_1_10_0》,主要是用“将wchar_t类型视为内置类型”的选项改为否。见下图。

VS2005(VC8)编译Xalan-C_1_10_0(更好的方法)

这样修改后,随之带来的问题是,使用这个库的工程(包括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

继续阅读