近日,ZeroC 官方发布了最新的 Ice 3.3.1 版本,我也对其进行了完整的编译,包括其使用的第三方库的编译,现把编译过程记录在此。
编译的环境与代码下载
本次编译是基于 Intel x86 架构下的 Win32 平台,使用的是 Microsoft Visual Stuido 2005,其中 C++ 编译器为 msvc 8.0。
在 ZeroC 官方网站上,我们可以下载到 ICE 的源代码包。我准备完全从源代码编译,所以我需要下面两个包:
- Ice-3.3.1.zip - 这个包包括了 ICE 的所有语言的源代码
- ThirdParty-Sources-3.3.1.zip (Windows) - 这个包里包含了所有 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 默认提供的环境变量编辑实在是太难用了,所以推荐使用这样的工具来使我们的编译生活更加舒适。
在使用这个环境变量编辑器时,我建议我们将所有自己定义的环境变量都加到用户部分,而不去影响系统部分(也就是编辑器的右边)。建议增加的环境变量有 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 了。
通过环境变量编辑器软件来管理你的环境,使得环境设置很方便:
转自老所的blog http://blog.ipattern.org/archives/874