UBUNTU下面安装ICE失败记录过程

ICE是ZEROC的开源通信协议产品,它的全称是:The Internet Communications Engine,翻译为中文是互联网通信引擎,是一个流行的面向对象的工具包,使我们能够以最小的代价构建分布式应用程序。ICE使我们专注于应用逻辑的开发,它来处理所有底层的网络接口编程,这样我们就不用去考虑这样的细节:打开网络连接、网络数据传输的序列化与反序列化、连接失败的尝试次数等。
这篇文章只是记载了在UBUNTU下面安装ICE的失败的过程,但是这里的失败并不是什么都没有安装好,最终影响到ICE的在JAVA中使用是ORACLE的Berkeley DB安装时,指定参数"--enable-java",会报这样的错误:checking if java works... configure: error: The Java VM java failed (see config.log, check the CLASSPATH?),我这里尝试了多种解决方案,最终没有在UBUNTU下面成功安装Berkeley DB,但是要使用slice2java,必须要在安装Berkeley DB时指定参数"--enable-java",所以就差这一步没有能够在UBUNTU下面使用slice2java,这个问题后面再尝试解决。

1、因为ICE没有已经编译好的UBUNTU安装包,只有WINDOWS及部分LINUX(如REDHAT、SuSE、MacOS X及Solaris)平台的安装包,要在UBUNTU上面使用,只有下载其源码重新编译后再安装。下载ice的源码,下载页面:http://www.zeroc.com/download.html,选择Source Distributions下面的源码进行下载,目前的版本是3.4.1,下载地址是http://www.zeroc.com/download/Ice/3.4/Ice-3.4.1.tar.gz。
2、要安装其它版的ICE必需要先安装C++版本的ICE,因为其它版本安装时要调用这些链接库,通过命令:
tar -xf Ice-3.4.1.tar.gz
将它解压缩后,进入它的cpp目录,执行编译:
make
报错如下:
ConnectionI.cpp:28:19: error: bzlib.h: 没有那个文件或目录
查看其安装说明,需要依赖如下软件:
Berkeley DB    http://www.oracle.com/database/berkeley-db/index.html
expat          http://expat.sourceforge.net
OpenSSL        http://www.openssl.org
bzip2          http://sources.redhat.com/bzip2
mcpp           http://mcpp.sourceforge.net
猜想,应该依赖的软件没有安装,于是把上面列出来的依赖软件,除Berkeley DB以外都安装或升级了一下:
sudo apt-get install expat
sudo apt-get install openssl
sudo apt-get install bzip2
sudo apt-get install libmcpp-dev (必须要安装dev版,否则有问题,如这个贴子:http://www.zeroc.com/forums/help-center/5192-building-ice-source-ubuntu-10-10-a.html)
还是报上面的错误,于是再搜索,从这个贴子http://www.zeroc.com/forums/help-center/1815-instalation-error.html得知需要安装bzip2的开发版:libbz2-dev
于是安装:
sudo apt-get install libbz2-dev
这下上面的错误没有了,但出现了新的错误:
Parser.cpp:13:19: error: expat.h: 没有那个文件或目录
这个我猜应该也是需要安装开发版的原因吧,从网上搜索,在这里得到了答案:http://www.douban.com/group/topic/3018699/,安装开发版:
sudo apt-get install libexpat-dev
我FUCK,上面的问题没有了,又来一个:
../IceSSL/UtilF.h:17:25: error: openssl/ssl.h: 没有那个文件或目录
看来需要安装ICE的C++版,这些依赖的软件全部都得使用开发版了:
sudo apt-get install libssl-dev
再次执行make操作,再报错如下:
../Freeze/ObjectStore.h:62: error: ISO C++ forbids declaration of ‘Db’ with no type
../Freeze/ObjectStore.h:62: error: expected ‘;’ before ‘*’ token
这个错误应该是没有安装Berkeley DB的原因,于是乎再按下面的步骤安装Berkeley DB4.8。

3、安装Berkeley DB4.8
1)、下载源码RPM包,并解压;
2)、linux安装进入到build_unix目录,执行配置命令:../dist/configure --enable-java (根据ICE的JAVA安装版的说明,在linux环境下需要加上--enable-java参数)
此时报如下错误:
checking if java works... configure: error: The Java VM java failed (see config.log, check the CLASSPATH?)
解决步骤:
A)、检查JAVA的环境配置,执行java-version及javac -version都显示正常;
B)、单独编译当前目录下生成的Test.java:javac Test.java,执行成功,说明不明JDK本身的问题;
看它的UNIX安装指南:
The Berkeley DB distribution uses the Free Software Foundation's autoconf and libtool tools to build on UNIX platforms. In general, the standard configuration and installation options for these tools apply to the Berkeley DB distribution.
中提到有libtool及autoconf,于是再安装libtool及autoconf:
C)、安装libtool:sudo apt-get install libtool,再执行配置命令,显示同样的错误;
D)、安装autoconf:sudo apt-get install autoconf,再执行配置命令,显示同样的错误;
E)、将/usr/bin/libtool:/usr/bin/autoconf增加到CLASHPATH中,执行source .bashrc后再执行配置命令,显示同样的错误;
F)、根据错误提示,网上查询,有人反馈这是JDK6的BUG,因为JDK5下面可以操作成功(http://linuxfromscratch.org/pipermail/blfs-dev/2008-March/018363.html),于是重新下载JDK6-UPDATE25版本替换我现在使用的JDK6-UPDATE20,还是报相同的错误;
G)、换JDK的版本build 1.5.0_22-b03,再执行配置命令,还是报相同的错误,那说明不是JDK的问题;
我快疯了,没有办法了,现在只有先去掉参数“--enable-java”,否则后面的就没有办法继续了,待以后想明白了再继续,没有这个参数就可以正常编译及安装了,难道这个真的是JDK的BUG?!。
3)、重新编译只需要在当前目录下执行如下命令:
make clean
make
make install
如果是想改变配置,执行如下命令:
make realclean
../dist/configure
make
make install
4)、卸载BDB:
make uninstall

4、再次继续上面第2中的操作,执行make,报如下错误:
../Freeze/TransactionI.h:15:20: error: db_cxx.h: 没有那个文件或目录
从这里http://www.zeroc.com/forums/help-center/4560-install-ice-3-3-1-gentoo-system.html看到,是安装BDB的时候参数设置不正确,需要加上参数"enable-cxx",于是再通过以下配置BDB:
../dist/configure enable-cxx
及编译安装操作
make clean
make
make install
再次执行ICE的CPP编译make时,还是报同样的错误
这个时候查看文件:cpp/config/Make.rules时,发现其中有一个变量$(DB_HOME),这个应该是BDB的安装路径的全局环境变量,查看BDB下面的configure文件,它的默认安装目录是/usr/local/BerkeleyDB.4.8,
于是在我的用户路径根目录下面的配置文件.bashrc中增加这个环境变量:
export DB_HOME=/usr/local/BerkeleyDB.4.8
再把它的bin目录增加到PATH中,增加下面这个到PATH后面:
:$DB_HOME/bin
使配置生效:
source .bashrc
这个时候需新开一个会话窗口,再转到ICE的CPP目录下面,再次执行make命令,终于跑起来了,完成后,再执行一下make install就安装成功了

5、此时安装JAVA版的ICE了,此时需要将ICE的安装目录设置到全部变量中,在.bashrc中增加:
export ICE_HOME=/opt/Ice-3.4.1
并将bin目录增加到PATH中:
:$ICE_HOME/bin
将$DB_HOME/lib增加到CLASSPATH中
1)、这里我只需要生成Ice.jar,编译是基于ant的,在java目录下面执行:
ant ice-jar
即生成Ice.jar在当前的lib目录下面。
2)、如果是要生成与Freeze及IceGrid管理控制台一起使用的ICE,使用下面的命令:
ant jar
不过这时需要安装这两个软件:
JGoodies  http://www.jgoodies.com/downloads/libraries.html
ProGuard  http://proguard.sourceforge.net
3)、如果需要生成包括测试及示例程序的完整源包,采用如下命令:
ant
详细的参见当前目录下的INSTALION文件,其中有说明。

6、使用slice2java
在命令行打入命令slice2java,报如下错误:
slice2java: error while loading shared libraries: libSlice.so.34: cannot open shared object file: No such file or directory
这里有答案:http://www.zeroc.com/forums/help-center/870-slice2java-command.html
不过在ICE的cpp的LINUX安装说明文件中也有这样的说明:
LD_LIBRARY_PATH environment variable to add the "lib" directory
自己大意了,在.bashrc中增加如下:
export LD_LIBRARY_PATH=/opt/Ice-3.4.1/lib
并执行:
source ~/.bashrc
再次打入slice2java命令就可以出现帮助信息了。

7、本以为一切都OK了,可是当我通过执行:
slice2java A.ice
时,报error: Can't open include file "Ice/BuiltinSequences.ice"这样的错误,这个帖子http://www.zeroc.com/forums/help-center/4134-unable-compile-ice.html有说明是因为没有将BDB的db.jar放到环境变量中,这个又使我郁闷了,我的BDB安装的时候,根本就不能够指定参数“--enable-java”,这个bd.jar根据就不存在,我靠,看来我只有选择使用WINDOWS的安装文件,享受MS给我带来的便捷了。

本文出自:冯立彬的博客

代码交流 2021