一、背景:
原来在Unix平台解析XML协议时使用的IBM公司的XML4c开发包,XML4c开发包本身起源于apache的开源项目Xercesc-C,IBM公司在Xercesc-C的基础上增加了多达150多种字符编码格式的支持;后来需要将操作系统由原来的Unix移植到Linux,因此需要得到支持Suse-Linux的Xml解析库。
二、寻找的过程
在登录到IBM关于XML4c的官方网站http://www.alphaworks.ibm.com/tech/xml4c,发现XML4c项目已经不再开发了,交还给了Apache,心里不禁凉了半截,因为原来Apache的Xercesc项目虽然和XML4c接口都一样,但是最关键的是不支持GB2312编码!但是,天无绝人之路,硬着头皮接着读了一段E文发现:如果Xercescc-和International Components for Unicode (ICU)一起编译得到的二进制库等价于Xml4c!
XML4C has graduated.
XML4C now consists of Apache's Xerces-C XML Parser, which is distributed under the The Apache Software License, Version 1.1, and International Components for Unicode (ICU), which is distributed under the IBM Public License. These two components are available at the above links.
See also information about Unicode.
If Xerces-C is built with ICU, a library equivalent to XML4C will be created. Instructions for building Xerces-C with ICU can be obtained from Xerces-C's Web site. If you have any further questions concerning XML4C, please contact Lisa Martin.
于是兵分两路,先到Apache网站上下载Xercesc-C++的源代码和库,在http://xml.apache.org/xerces-c/上溜达了一圈后发现只有单独编译的Xercesc库没有和ICU联编的直接下载下来就能用的库,只好决定自己下载源代码编译Xercesc和ICU的联编库。
很顺利的在http://xml.apache.org/xerces-c/download.cgi下载到了Xercesc的源代码:xerces-c-current.tar.gz
但是找了半天没有找到ICU的下载地址,只好求助于号称连原子弹都能造出来的Google,幸运的是找到了一个IBM的FTP:
ftp://ftp.software.ibm.com/software/globalization/icu/3.4
在上述的FTP里成功下载到了icu-3.4-RHEL3-gcc3.2.3.tgz
需要说明的是都没有下载到直接支持Suse Linux的,只好抱着试试看的心情下载了支持RedHat的!
三、编译的过程
把上述两份文件分别解压后分别上传到Linux机器上的用户目录/home/zxin10,应该能够看见两个新目录/home/zxin10/xerces-c-src_2_6_0和/home/zxin10/icu
在.profile中设置环境变量、路径等,主要增加了:
PATH=$PATH::/home/zxin10/icu/bin:/home/zxin10/icu/lib
LD_LIBRARY_PATH=/home/zxin10/icu/bin:/home/zxin10/icu/lib XERCESCROOT=/home/zxin10/xerces-c-src_2_6_0
ICUROOT=/home/zxin10/icu
export PATH LD_LIBRARY_PATH XERCESCROOT ICUROOT
设置好环境变量后同时还要进入$ICUROOT/bin和$ICUROOT/sbin目录执行命令
zxin10@hpserver1:~/icu/bin> chmod +x *
修改文件的可执行权限!
做好上述设置后编译之旅就开始了
zxin10@hpserver1:~> cd $XERCESCROOT
zxin10@hpserver1:~/xerces-c-src_2_6_0> cd src/xercesc
zxin10@hpserver1:~/icu> unset LANG /*说明这个命令主要是去掉字符集设置,否则出错信息可能为乱码 */
zxin10@hpserver1:~/xerces-c-src_2_6_0/src/xercesc> autoconf
zxin10@hpserver1:~/xerces-c-src_2_6_0/src/xercesc> ./runConfigure -plinux -cgcc -xg++ -micu -nsocket -ticu –rpthread
/* 说明:这个命令比较关键其中-micu 和 –ticu表示是编译与ICU联编!*/
zxin10@hpserver1:~/xerces-c-src_2_6_0/src/xercesc> gmake
开始编译了。。。
第一次编译果然没有成功:)
pkgdata: No -O option found, trying 'icu-config --incfile'.
pkgdata: icu-config: using '-O /usr/local/lib/icu/3.4/Makefile.inc'
# Reading res-file-list.txt..
Warning: Found path 'XercesMessages_' in file name. Assuming compatibility (-E) mode.
# Output file: ./lib$(LIBNAME).so
/usr/bin/gmake -f ./XercesMessages_dll.mak
gmake[3]: Entering directory `/home/zxin10/xerces-c-src_2_6_0/src/xercesc/util/MsgLoaders/ICU/resources'
./XercesMessages_dll.mak:14: /usr/local/lib/icu/3.4/Makefile.inc: Permission denied
仔细研究后发现可能里面有些默认文件的默认路径没有修改,于是顺藤摸瓜,发现这句
“pkgdata: icu-config: using '-O /usr/local/lib/icu/3.4/Makefile.inc'“,
明明我设置的路径不是这个啊!于是进入$ICUROOT/bin打开icu-config一看,发现了
这一句:
default_prefix="/usr/local"
毫不犹豫的就把他修改成了default_prefix="/home/zxin10/icu"
重新编译,这一关顺利过去,但又出现类似错误
/home/zxin10/icu/lib/icu/3.4/Makefile.inc:258: /usr/local/share/icu/3.4/config/mh-linux: No such file or directory 有了上次的经验,很快就打开Makefile.inc文件将其中的
prefix = /usr/local修改成了 prefix=/home/zxin10/icu
再重新编译,就一路顺风,终于见到了OK两字!
迫不及待的进入zxin10@hpserver1:~/xerces-c-src_2_6_0/lib> 执行LL命令查看
终于出现了梦寐以求的.so库,真是欣喜若狂!
四、使用的过程
看看右下角的时间,提前吃中饭的时间已经到了,由于心情迫切,我第一次没有提前去吃中饭。
将目录zxin10@hpserver1:~/xerces-c-src_2_6_0/lib>中的所有文件主要包括:
libxerces-c.so
libxerces-c.so.26
libxerces-c.so.26.0
libxerces-depdom.so
libxerces-depdom.so.26
libxerces-depdom.so.26.0
libXercesMessages.so
libXercesMessages.so.26
libXercesMessages.so.26.0
拷贝到了zxin10@hpserver1:~/lib>(这是应用程序Lib路径)
然后执行编译命令,看着打印信息如行云流水一般向上翻页,真是心情舒畅啊,正在得意之际,突然嘎然而止,定睛一看提示的是
“/home/zxin10/lib/libxerces-c.so: undefined reference to `XercesMessages_dat'”头皮不禁有点发麻,难道编译的库有问题?正百思不得其解之际,发现“XercesMessages_dat”和“libXercesMessages.so.26“有太多的字母一样了,不由得不让我不把它们联系到一起。难道是makefile中没有load?可是我清晰的记得再NT版本下不需要包含,只要包含一个Xercesc的库就可以了!只有抱着试试看看的态度,打开/home/zxin10/src/os/makefile,增加了一个LDLIBS=-lXercesMessages。
再编译,终于通过生成了可执行文件,经过简单验证,向业务程序发送带有中文的GB2312编码的XML消息,终于解码成功!!
这里不得不感谢上周末的科室活动,使得工作效率空前提高:)