IT点滴

我不去想是否能够成功 既然选择了远方 便只顾风雨兼程
  博客园  :: 首页  :: 联系 :: 订阅 订阅  :: 管理

[转]在 WIN32 平台下完整编译 ZeroC ICE 3.3.1

Posted on 2009-07-02 15:48  Ady Lee  阅读(2560)  评论(0编辑  收藏  举报

近日,ZeroC 官方发布了最新的 Ice 3.3.1 版本,我也对其进行了完整的编译,包括其使用的第三方库的编译,现把编译过程记录在此。

编译的环境与代码下载

本次编译是基于 Intel x86 架构下的 Win32 平台,使用的是 Microsoft Visual Stuido 2005,其中 C++ 编译器为 msvc 8.0。

ZeroC 官方网站上,我们可以下载到 ICE 的源代码包。我准备完全从源代码编译,所以我需要下面两个包:

从 ICE 3.3.0 版本开始,就不在分别为各种语言准备源代码包了,而是将所有语言的代码打成一个大包,所以,我们如果打开 Ice-3.3.1.zip 这个包,将会看到不同的子目录,分别对应于:C++、C#、Java、PHP、Python、Ruby、VB。如果我们需要了解详细的编译安装说明,我们需要进入相应的语言的子目录,然后阅读里面的 INSTALL 文件。

在第三方库源代码包里,分别是各种支持库的源代码,包括:BZip、Berkeley DB、Forms、Looks、mcpp、openssl、STLport、expat。鉴于我使用的是 MSVC 8.0 ,所以 STLport 就不需要了,而我又只准备编译 C++ 语言的环境,所以我将只用到如下的库:BZip、Berkeley DB、mcpp、openssl、expat。

工具及环境的准备

俗话说:磨刀不误砍柴工。在开始编译之前,我也向大家推荐几个好用的工具。

首先是 Rapid Environment Editor,这是一个用来编辑环境变量的工具。在开发过程中,环境变量能给我们提供很大的方便,比如我们将所有头文件的搜索路径可以放到 INCLUDE 环境变量中,库文件的路径放到 LIB 环境变量中等等。但 Windows 默认提供的环境变量编辑实在是太难用了,所以推荐使用这样的工具来使我们的编译生活更加舒适。

env-editor

在使用这个环境变量编辑器时,我建议我们将所有自己定义的环境变量都加到用户部分,而不去影响系统部分(也就是编辑器的右边)。建议增加的环境变量有 PATH、INCLUDE、LIB。每次改变了环境变量,我们需要保存后,然后重启我们的命令行窗口,以使修改生效。

第二个需要用到得工具是 Active Perl,因为其中的 openssl 编译需要使用 Perl 来进行环境配置。这个我们直接去其主页下载安装即可,在安装的过程中,会提示你是否将 perl 加入你的 PATH 变量中,当然,选择 YES。

第三个工具是 Python,这个主要是为了运行 Ice 的测试程序。

第四个工具是 ant 和 java,这个在 Ice 的安装时需要用到。要安装这个工具,首先我们需要到 java.sun.com 去下载 jre 或者 jdk,然后去 ant 的网站下载 ant 工具,这个工具是个绿色工具(java程序),随便解压到你的硬盘,然后将其 bin 的路径设置到 PATH 环境变量里。

最后一个工具是 patch,这个我们选择 GnuWin32 项目里的 patch 工具。安装完毕后,我们需要手动将其 bin 目录加入我们的 PATH 变量中,一般来讲,这个目录是:C:\Program Files\GnuWin32\bin 。

工具准备好了,我们要规划一下目录结构。为了方便使用,ICE 需要两个目录:

  • Ice-3.3.1-ThirdParty-VC80 - 这个目录放置第三方库的文件,其下我们需要自己建立三个子目录:bin, include, lib ,为了以后方便使用,我们可以将这三个子目录分别加入我们的 PATH, INCLUDE, LIB 环境变量中。注意目录的命名:Ice-$(VERSION)-ThirdParty-$(CPP_COMPILER)
  • Ice-3.3.1-VC80 - 这个目录我们不用预先建立,我们将Ice的安装路径设置到此,到时候会将所有需要的文件拷贝至此,其下也将创建 bin, include, lib 三个子目录,如果我们将这三个子目录也放进相应的环境变量中,则以后使用 ICE 将更加方便。其命名方式为:Ice-$(VERSION)-$(CPP_COMPILER)

好,环境准备差不多了,我们接下来就进行编译了,所有编译均使用命令行方式(除了DB的编译),所以要使用 Visual Stuido Command Line 窗口。

编译mcpp

在 ThirdParty-Sources-3.3.1.zip 包中,将 mcpp-2.7.2.zip 解压到一个临时的目录下,然后:

] cd mpp-2.7.2\src
] patch -p0 < ..\noconfig\vc2005.dif
] nmake MCPP_LIB=1 /f ..\noconfig\visualc.mak mcpplib

然后,拷贝文件:

  • mpp-2.7.2\src\mcpp.lib => $(3PARTY)\lib

编译bzlib

在 ThirdParty-Sources-3.3.1.zip 包中,将 bzip2-1.0.5.tar.gz 解压到一个临时目录下,同时,将 bzip2 目录也解压到同级临时目录下,这个目录里包括了补丁和修改过的 Makefile。然后:

] cd bzip2-1.0.5
] patch -p0 bzlib.h < ..\bzip2\bzlib.patch
] nmake /f ..\bzip2\Makefile.mak

然后,拷贝文件:

  • bzip2-1.0.5\bzlib.h => $(3PARTY)\include
  • bzip2-1.0.5\bzip2.dll => $(3PARTY)\bin
  • bzip2-1.0.5\libbz2.lib => $(3PARTY)\lib

安装expat

对于 expat 库,ThirdParty-Sources 包里提供的是安装程序,我们直接执行它,会在 Program Files 目录里创建 Expat 2.0.1 目录,我们进入该目录,直接拷贝文件:

  • Bin\libexpat.dll => $(3PARTY)\bin
  • Bin\libexpat.lib => $(3PARTY)\lib
  • Source\lib\expat.h => $(3PARTY)\include
  • Source\lib\expat_external.h => $(3PARTY)\include

编译openssl

解压 ThirdParty-Sources 包里的 openssl-0.9.8g.tar.gz 到临时目录下,然后对齐进行编译,这个需要 Perl 和 汇编编译器,我们的 Visual Stuido 2005 里应该带了 MASM ,所以无需重新安装,你可以调用 ml 来尝试是否有该编译器。编译过程如下:

] cd openssl-0.9.8g
] perl Configure VC-WIN32 --prefix=C:/openssl-tmp
] ms\do_masm
] nmake /f ms\ntdll.mak
] nmake /f ms\ntdll.mak test
] nmake /f ms\ntdll.mak install

注意,在填写 prefix 时,目录分隔符必须使用反斜杠’/',如果使用’\',则编译会报错。

然后,会在安装目录(这里是C:\openssl-tmp)里同样生成 include, bin, lib 三个目录,将这三个目录直接覆盖到我们的 $(3PARTY) 目录下即可。

编译 Berkeley DB

解压 ThirdParty-Sources 包里的 db-4.6.21.NC.zip 到临时目录下,并将包里 db 目录下的补丁文件也解压到 db-4.6.21.NC 目录下,然后执行:

] cd db-4.6.21.NC
] patch --binary -p0 < patch.4.6.21.1
] patch --binary -p0 < patch.4.6.21.2
] patch --binary -p0 < patch.4.6.21.3
] patch --binary -p0 < patch.4.6.21.15663

注意,在打补丁的时候,由于补丁制作有点问题,所以这里我们需要使用 --binary 模式,否则补丁无法成功。

接下来,使用 Visual Stuido 的 IDE 来进行编译:进入 build_windows 子目录,打开解决方案文件 Berkeley_DB.dsw。这是老版本的工程文件,所以会询问你是否转换,选择“是”,然后从编译配置中选择我们需要的“Release x86”,在 build_all 项目上右键点击,选择“build”即可完成编译。

编译结束后,拷贝文件:

  • build_windows\db.h => $(3PARTY)\include
  • build_windows\db_cxx.h => $(3PARTY)\include
  • build_windows\Release\libdb46.lib => $(3PARTY)\lib
  • build_windows\Release\libdb46.dll => $(3PARTY)\bin
  • build_windows\Release\*.exe => $(3PARTY)\bin

开始编译Ice

支持库终于编译完成(这些只是 C++ 环境需要的),我们开始编译 Ice 库。

将 Ice-3.3.1 解压到临时目录下,编辑 Ice-3.3.1\cpp\config\Make.rules.make 文件:

#
# Select an installation base directory. The directory will be created
# if it does not exist.
#
prefix = E:\win\lib\Ice-$(VERSION)-VC80

#
# Define OPTIMIZE as yes if you want to build with
# optimization. Otherwise Ice is build with debug information.
#
OPTIMIZE = yes

#
# Specify your C++ compiler. Supported values are:
# VC60, VC80, VC80_EXPRESS, VC90, VC90_EXPRESS, BCC2007, BCC2009
#
!if "$(CPP_COMPILER)" == ""
CPP_COMPILER		= VC80
!endif
#
# If third party libraries are not installed in the default location
# or THIRDPARTY_HOME is not set in your environment variables then
# change the following setting to reflect the installation location.
#
!if "$(CPP_COMPILER)" == "VC80_EXPRESS"
THIRDPARTY_HOME_EXT	= VC80
!elseif "$(CPP_COMPILER)" == "VC90_EXPRESS"
THIRDPARTY_HOME_EXT	= VC90
!else
THIRDPARTY_HOME_EXT	= $(CPP_COMPILER)
!endif

!if "$(THIRDPARTY_HOME)" == ""
THIRDPARTY_HOME = E:\win\lib\Ice-$(VERSION)-ThirdParty-$(THIRDPARTY_HOME_EXT)
!endif

#
# For VC80 it is necessary to set the location of the manifest tool.
# This must be the 6.x version of mt.exe, not the 5.x # version!
#
!if "$(CPP_COMPILER)" == "VC80"
MT = "$(VS80COMNTOOLS)bin\mt.exe"
!else
MT = mt.exe
!endif

主要修改三个配置:第三方库的目录、安装的目录和是否启动Release版本编译。

在讲第三方库的bin, include, lib目录分别设置进 PATH, INCLUDE, LIB 环境变量后,执行:

] cd Ice-3.3.1\cpp
] nmake /f Makefile.mak
] allTests.py
] nmake /f Makefile.mak install

注:我在执行 allTests.py 的时候有个异常,不清楚是怎么回事,不过不影响使用。在 install 的时候会使用到 ant 工具,所以需要先安装 java + ant。参考前面介绍工具准备一节。

至此,Ice 3.3.1 的 C++ 环境已经编译安装好了,我们需要将 Ice-3.3.1 以及其第三方库的 bin, include, lib 路径放入 PATH, INCLUDE, LIB 环境变量中,即可使用 C++ 版本的 Ice 3.3.1 了。

通过环境变量编辑器软件来管理你的环境,使得环境设置很方便:

env

转自老所的blog http://blog.ipattern.org/archives/874