1.3.1获取APR
编译APR的第一个步骤就是获取APR开发包。通常情况下,你可以到APR的官方网站http://apr.apache.org/download.cgi去下载。
一般情况下,APR开发包很轻易理解为仅仅是一个开发包,不过事实上并不是。目前,完整的APR实际上包含了三个开发包:apr、apr-util以及apr-iconv,每一个开发包分别独立开发,并拥有自己的版本。
apr开发包位于目录${APR}/apr下,其中包含了一些通用的开发
组件,包括mmap,文件等等,前面已经描述过。
apr-util开发包位于目录${APR}/apr-util下,该目录中也是包含了一些常用的开发组件。这些组件与apr目录下的相比,它们与apache的关系更加密切一些。比如存储段和存储段组,加密等等,具体的各个组件的含义如下表所示:
组件名称
文件夹名称
描述
bUCkets
/srclib/apr-util/buckets
存储段和存储段组
crypto
/srclib/apr-util/crypto
加密和解密
hooks
/srclib/apr-util/hooks
apache挂钩
dbd
/srclib/apr-util/dbd
dbm
/srclib/apr-util/dbm
ldap
/srclib/apr-util/ldap
轻量级目录访问协议
strmatch
/srclib/apr-util/strmatch
字符串匹配,包括普通字符串匹配以及正则表达式匹配,正则表达式匹配中使用prec库
uri
/srclib/apr-util/uri
uri操作例程
/srclib/apr-util/xml
xml支持例程,其中使用eXPat作为xml解析器
xlate
/srclib/apr-util/xlate
i18n 转换库
encoding
/srclib/apr-util/encoding
编码转换库,其中实现了各种编码之间的转换
misc
/srclib/apr-util/misc
大杂烩
apr-util的当前版本为1.2.2,最早的版本为0.9.1。
apr-iconv包中的文件主要用于实现iconv编码。目前的大部分编码转换过程都是与本地编码相关的。在进行转换之前必须能够正确地设置本地编码。因此假如两个非本地编码A和B需要转换,则转换过程大致为A->Local以及Local->B或者B->Local以及Local->A。
XPG2 标准中另外定义了一组全新的函式接口ICONV,该接口是一种更广义的字集转换系统。也是一个与本地编码无关的字集转换系统。APR中也支持这种字集转换系统,为此它提供了完整的实现。Apr-iconv正是为此目的而产生。
apr-iconv的当前版本为1.1.1,最早的版本从0.9.2开始。
1.3.2APR的目录组织
从http://www.apache.org/上下载apr-1.1.1.tar.gz到本地解压后,可以发现APR的目录结构很清楚。
1) 所有的头文件都放在$(APR)/include目录中;
2) 所有功能接口的实现都放在各自的独立目录下,如threadproc、mmap等目录中,而这些目录的子目录中包含实际的实现代码。Apache中划分子目录的根据就是编译代码所在的平台,目前APR能够支持Unix、BeOS、Windows以及OS2四种平台,因此正常情况下,每一个目录中会包含这四个子目录。比如文件I/O的目录就如下所示:
apr
-> file_io
-> unix The Unix and common base code
-> win32 The Windows code
-> os2 The OS/2 code
在上面的四种子目录中,unix是一个比较非凡的目录。由于Unix的种类很多,比如FreeBSD,
linux等等,原则上应该都为这些平台分别建立各自的子目录,然后分别实现代码。不过所有的Unix都大同小异,假如为了稍许的差异就“大动干戈”,不太划算,因此APR中将所有的Unix的平台的操作合并到一起,而这些平台这些的差异就用前面的预定义宏来区别。目前的unix目录中以POSIX为主,同时兼顾System V。上面的文件I/O操作中明显的缺少了BeOS平台的实现,那是因为BeOS的实现合并到Unix目录中去了。
另外两个非凡的目录就是include和test目录了。include目录中包含了所有的外部使用所需要的头文件。其中APR.h和apr_private.h是两个非凡的文件,假如要使用APR,必须包含apr.h头文件。但在原文件中并看不到这两个文件。事实上,这两个文件都是自动生成的。由于windows和netware平台下并不使用autoconf,因此APR在windows和netware平台下的行为与其余所有平台都不相同。在UNIX上,apr_private.h(APR私有文件,仅仅APR内部使用)和apr.h(APR公共文件,可以其余的文件使用)实际上在代码中并不存在,它们都是由autoconf从acconfig.h和apr.h.in中自动生成的。而在Window中,这两个文件都由apr_private.hw(apr_private.hwn)和apr.hw(apr_private.hwn)中自动生成。
test则是测试程序的目录。每一个APR类型在使用之前都必须经过测试。事实上对于APR的使用者而言,这个目录还有另外的一个好处,就是快速把握APR类型的使用。每一个测试例子都给出了具体类型的使用方法。
3) 此外就是相关平台构建工具文件如Makefile.in,configure.in等等。
1.3.3APR构建
在Window和Unix上编译APR的方法不太相同,我们分开来描述。
1.3.3.1 Unix上编译
We've attempted to ensure that compiling apr, apr-iconv and apr-util distribution tarballs requires nothing more than what comes installed by default on various UNIX platforms.
All you should have to do is this:
./configure
make
make install
As of this writing, APR is not quite ready to be installed as a system-wide shared library; it currently works best when tied directly to the
application using it.
Note that if you are compiling directly from the SVN repository, you'll need GNU autoconf and GNU liBTool installed, and you'll need to run ./buildconf before running the commands listed above.
1.3.3.2 Window平台上编译
The apr-util/aprutil.dsw workspace builds the .dsp projects of the Apache server listed with dependent projects preceeding their dependencies:
apr-util/aprutil.dsp
apr-util/libaprutil.dsp
apr-util/uri/gen_uri_delims.dsp
apr-util/xml/expat/lib/xml.dsp
apr-iconv/apriconv.dsp
apr-iconv/libapriconv.dsp
apr/apr.dsp
apr/libapr.dsp
The libXXX projects create .dll targets, dynamic shared libraries. Their non-libXXX counterparts create static .lib targets.
To compile code for the libraries, the consuming compiliation must include the apr/include and apr-util/include Directories in their include file search paths. To target the static .lib versions of the library, the consuming compiliation must define the macros APR_DECLARE_STATIC and APU_DECLARE_STATIC. This prevents the apr and apr-util symbols from being tagged as __declspec(dllimport), eliminating compiliation warnings and speeding up execution.
在Window平台上要成功编译apr、apr-iconv以及apr-util,必须具备一下的几个条件:
1)、可用的微软编译器:比如微软的Visual C++ 5.0或者更高的版本,比如Visual C++6.0,Microsoft Visual Studio.NET 2002,Microsoft Visual Studio.NET 2003(必须具备Visual C++ .NET编译器)。
对于Visual C++ 5.0的用户,为了能够使用一些APR中的新特性,你必须更新Windows平台开发包(Windows Platform SDK)。对于Visual C++ 6.0则没有这些多余的事情,因为这些SDK随Visual C++6.0一起发布了。假如没有这些新的SDK,使用MSVC++5.0编译的时候,编译中会出现大量新特性不支持的警告,甚至完全编译失败。至于具体的SDK,你可以到Window的网站上去下载。
目前最近的APR版本是2.2.0,不过你假如使用老一些的APR,比如1.1.1以前,那么你还需要awk。你可以到http://cm.bell-labs.com/cm/cs/who/bwk/awk95.exe去下载二进制可执行文件。不过从1.1.1以后的版本就可以省去这个麻烦了。
2)、正确的目录布局
除了必要的编译工具之外,APR开发包还必须具备正确地目录布局。apr,apr-util以及apr-iconv必须同时具备,并且它们必须位于同一目录之下,比如:
C:/work/apr/
C:/work/apr-iconv/
C:/work/apr-util/
对于发行版本,直接将发行的文件包解压到指定目录下即可;而对于开发版本,你必须能够从subversion中自行检出,Window平台下,APR推荐的SVN是TortoiseSVN。
万事具备,只欠东风。现在你可以编译APR了。你可以选择两种方式,或者是命令行编译,或者是使用IDE编译。
■ 命令行方式编译
使用命令行进行编译的第一步就是修改vcvars32.bat,通常情况下该文件位于C:/Program Files/Microsoft Visual Studio/VC98/Bin目录下,其中C:/Program Files/Microsoft Visual Studio/是VC的安装目录,它根据安装目录的不同会不同。
"C:/Program Files/DevStudio/VC/Bin/vcvars32.bat"
If necessary, you will also need to prepare the Platform SDK environment:
假如有必要,你还必须预备Platform SDK相关的环境变量,这个通常修改setenv.bat文件就可以实现:
"C:/Program Files/Platform SDK/setenv.bat"
一旦设置完毕,你首先必须切换到apr-util目录下,然后简单的执行下面的指令就可以编译APR了。
msdev aprutil.dsw /MAKE /
apriconv - Win32 Release" /
apr - Win32 Release" /
libapr - Win32 Release" /
gen_uri_delims - Win32 Release" /
xml - Win32 Release" /
"aprutil - Win32 Release" /
msdev aprutil.dsw /MAKE /
libapr - Win32 Release" /
libapriconv - Win32 Release" /
gen_uri_delims - Win32 Release" /
xml - Win32 Release" /
libaprutil - Win32 Release" /
这两个命令都可以编译APR,不过它们的区别就是后一个编译结果是动态链接库.dll,而前者则是静态连接库.lib。不过它们编译的都是发行版,假如你需要编译调试版本,只需要简单的将命令中的”Release”替换为”Debug”即可,这样,你就可以方便的进行调试了。
For Visual Studio C++ 5.0 command line users: Only the .dsp files are maintained within SVN. Win32 .mak files are NOT maintained in SVN, due to the tremendous waste of reviewer's time. Therefore, you cannot rely on the NMAKE commands above to build revised .dsp project files unless you then export all .mak files yourself from the project.
■ IDE方式编译
与命令行编译相比,使用IDE编译更简单。事实上,在使用的时候我更倾向于使用IDE进行编译。:)。不过假如你是那种什么都得挖到底的人,前面的命令行编译你也可以试试。
IDE编译,你需要的仅仅是一个dsw工作区aprutil.dsw,它位于apr-util目录下,该工作区中包含了完整编译整个APR所需要的所有的.dsp项目文件,以及各个dsp文件之间的依靠关系,以确保它们之间的正确的编译顺序。
打开aprutil.dsw,整个工作区如下图所示:
点击查看大图从上图中可以看出,apr-util.dsw工作区中包含了十个dsp工作项目。Apr、apriconv以及aprutil分别对应静态编译库,而libXXX则对应的是动态编译库。默认情况下,编译的是apr项目,不过你可以通过project->Set Active Project选择你需要编译的实际项目:
编译后aprXXX项目生成的静态库通常位于对应目录下的LibD目录中,而libXXX项目生成的动态库则位于Debug或者Release目录下,具体取决于当前是发行版本还是调试版本。
关于作者
张中庆,目前主要的研究方向是嵌入式浏览器,移动中间件以及大规模服务器设计。目前正在进行Apache的源代码分析,计划出版《Apache源代码全景分析》上下册。Apache系列文章为本书的草案部分,对Apache感爱好的朋友可以通过flydish1234 at sina.com.cn与之联系!
假如你觉得本文不错,请点击文后的“推荐本文”链接!!