2006年7月19日星期三

RedHat Linux 7.3下编译libxml2 2.6.24遇到的问题和解决方法

  单位的测试服务器是很早以前装的RedHat Linux 7.3。说是“测试服务器”,但由于种种原因,在上面已经跑了很多应用,再也离不开了,所以也没有办法把操作系统更新成比较新的版本。
  大概是昨天或今天早上的某个时候,这台机器被人重启了(或者是自己重启了),然后就死在了启动过程中。下午有人找我报告,才发现这个情况。再次重启之后,机器是没有问题了,但是又再一次体验了那满屏幕的问号。——老毛病了,每次自动启动的时候Apache+PHP的应用访问Oracle得到的多字节字符编码总是不对,重启一次Apache就好了。一直不知道是什么原因。
  心念一动,正好趁这个机会把这台服务器上的Apache+PHP+MySQL,以及周边的那些,如OpenSSL、libpng、libiconv等等,给重新整理一遍,应用上最新(或者说可用的最新)版本。
  OpenSSL、libiconv+gettext、libjpeg、libpng……,都很顺利。原本以为这些版本很新的东西会在不完全符合ANSI C++规范的2.96版GCC编译器上出问题,没想到居然一路绿灯。不过,好景不长,在libxml2-2.6.24上卡住了。
  错误信息包含下面几句:
……
xmlIO.c: In function `xmlCheckFilename':
xmlIO.c:619: syntax error before `struct'
xmlIO.c:621: `stat_buffer' undeclared (first use in this function)
……
  这种语法错误,不像是编译器版本的问题。我先试着跳过这一步,继续下面的安装。不过在编译PHP 5.1.4的时候,configure报告说需要libxml2的2.6.11以上版本,而我这台机器上以前的libxml2的版本只是2.6.7。显然,这个问题是无法回避了。
  拿错误信息去查,只有FreeBSD的技术支持站点上有一条bug报告的记录。不过可喜的是,报告中也附上了修正方法。经测试,该方法对于我的RedHat Linux 7.3也同样有效。
  以下转自该文:
Fix:
*** xmlIO.c.DIST Sat Apr 29 09:44:16 2006
--- xmlIO.c Sat Apr 29 09:44:35 2006
***************
*** 616,621 ****
--- 616,622 ----
}
#else
#ifdef HAVE_STAT
+ {
struct stat stat_buffer;
if (stat(path, &stat_buffer) == -1)
***************
*** 625,630 ****
--- 626,632 ----
if (S_ISDIR(stat_buffer.st_mode))
return 2;
#endif /* S_ISDIR */
+ }
#endif /* HAVE_STAT */
#endif /* WIN32 */
  想要修复这个错误的朋友,若看不懂上面的意思,就注意那两行标了加号的地方。原来的xmlIO.c,是没有这两行的,找到它们的位置后把它们补上,就可以通过编译了。行号人家也标出来了,在原xmlIO.c文件的616~621行附近。
  若看到这里还不明白,那就只好委屈了……

没有评论:

发表评论