王朝网络
分享
 
 
 

Apache APR可移植运行库简介(2)

王朝system·作者佚名  2008-06-01
宽屏版  字体: |||超大  

1.3 APR构建

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操作例程

xml

/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与之联系!

假如你觉得本文不错,请点击文后的“推荐本文”链接!!

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有