nis和ldap_LDAP和iPhone

iPhone进入手机市场后,iTunes商店中大量涌现了移动应用程序。 大量重复核心功能的应用程序使新应用程序容易被其竞争对手所掩盖。 为了使应用程序能够吸引消费者,添加竞争应用程序不支持的功能变得越来越必要。 但是,从头开始编写新功能可能会花费大量的开发时间和人力。 了解如何移植最初为UNIX®系统编写的库,可以使开发人员削减成本并将应用程序更快地投放市场。

iPhone使用的操作系统iOS是建立在UNIX内核之上的,而iOS的应用程序是使用GCC编译的,GCC与大多数UNIX系统使用的编译器相同。 这意味着可以花费一些时间和精力将大多数为UNIX系统编写的库移植到iPhone。

本文将引导您完成将库移植到通常在具有Autoconf和Make的环境中构建的iPhone的步骤。 尽管对于从GNU工具构建的软件包进行移植的解释不多,但本文应该为那些具有GNU工具知识的开发人员提供必要的面包屑,以便将软件包移植到Xcode和iOS平台中。

入门

本文中使用的示例已在Mac OS X 10.6.4和OpenLDAP 2.4.22上使用iOS SDK 4.1进行了测试。 尽管本文是使用iOS SDK 4.1编写的,但它应适用于iOS SDK的将来版本,几乎不需要任何更改。 示例的源文件和项目文件在“下载”部分的zip文件中。

iPhone SDK用于为iPhone OS平台编译移动应用程序。 该SDK提供了用于测试移动应用程序的文档,IDE和模拟器( 有关下载信息,请参阅参考资料 )。

OpenLDAP是轻型目录访问协议的免费开源实现。 该实现包括通过使用LDAP over TCP提供对X.500目录服务的访问的库( 有关下载信息,请参阅参考资料 )。

准备OpenLDAP源代码

Xcode是iPhone SDK附带的IDE。 它包含用于为iOS平台构建应用程序和库的模板和文档。 为了简化OpenLDAP的源代码树导航,我们首先将源代码导入Xcode项目。 要为iOS平台创建新的Xcode项目,请打开Xcode,然后从菜单栏上的“文件”菜单中选择“ 新建项目 ”。 这将打开一个包含三个面板的新对话框(请参见图1 )。 由于将使用该项目编译OpenLDAP客户端库,因此应使用静态库模板创建该项目。 在左侧面板上,选择iPhone OS标题下的Library 。 在右上方的面板中,选择Cocoa Touch Static Library 。 单击选择继续。

图1. Xcode中的New Project对话框
Xcode中的“新建项目”对话框

图2中的对话框用于设置Xcode项目的名称。

图2.将现有文件添加到Xcode项目的对话框
用于将现有文件添加到Xcode项目的对话框

Xcode将通过在lib之前添加.a并将其添加到项目名称中来创建库的名称。 因此,要创建名称为libldap.a的库,需要将项目名称设置为ldap。 在“另存为”框中键入名称,然后单击“ 保存” 。 这将创建一个目录,其中包含项目的初始文件。

现在已经创建了项目,可以从OpenLDAP导入源代码。 从OpenLDAP项目页面下载源代码,然后将tar文件解压缩到Xcode项目文件夹中。 从菜单栏上的“项目”菜单中,选择“ 添加到项目”。 在打开的文件浏览器中,选择Xcode项目中的文件夹,其中包含OpenLDAP的源代码,然后单击“ 添加”按钮。 应出现一个新对话框。 确保选中选项“为所有添加的文件夹递归创建组”,然后从目标列表中取消选择ldap。 单击添加按钮以完成将源代码添加到项目中。 现在,应将新名称为OpenLDAP目录的组放在Xcode主项目窗口的项目的“组和文件”面板中。

OpenLDAP源代码树包含一个目录,该目录包含头文件,这些头文件将包含在库使用的源文件中。 Xcode需要配置为告诉预处理器在处理#include指令时搜索此目录。 在Xcode主项目窗口的“组和文件”面板中双击项目名称。 这将打开项目信息窗口(请参见图3 )。 点击“在构建设置中搜索”搜索框,然后输入Header Search Paths 。 双击“值”字段以添加新的搜索路径,并添加openldap-2.4.22/include

图3.项目信息对话框
项目信息对话框

准备头文件

OpenLDAP已移植到许多平台。 OpenLDAP开发人员在编译时使用C头文件来定义系统信息。 通常,这些头文件是通过使用从AutoConf生成的脚本修改模板文件来创建的。 由于Xcode不使用Autoconf,因此必须手动修改这些文件。 必须修改的文件是lber_types.hin,ldap_config.hin,ldap_features.hin和Portable.hin。 这些文件位于OpenLDAP源代码树的include目录中。

lber_types.hin

文件lber_types.hin包含用于定义变量类型的模板。 模板文件需要重命名为lber_types.h。 可以通过在Xcode中右键单击文件名,然后从菜单中选择重命名来实现。 这将更新文件的Xcode元数据,以将其视为C头文件。 打开文件进行编辑,然后找到清单1所示的以下行。

清单1. lber_types.h
27 /* LBER boolean, enum, integers (32 bits or larger) */
28 #undef LBER_INT_T
29 
30 /* LBER tags (32 bits or larger) */
31 #undef LBER_TAG_T
32
33 /* LBER socket descriptor */
34 #undef LBER_SOCKET_T
35 
36 /* LBER lengths (32 bits or larger) */
37 #undef LBER_LEN_T

这些行将声明库使用的变量类型。 由于iPhone是32位平台,因此int类型是合适的值。 将#undef宏更改为#define并将变量类型设置为int(请参见清单2 )。

清单2.针对32位平台进行调整
27 /* LBER boolean, enum, integers (32 bits or larger) */
28 #define LBER_INT_T int
29 
30 /* LBER tags (32 bits or larger) */
31 #define LBER_TAG_T int
32
33 /* LBER socket descriptor */
34 #define LBER_SOCKET_T int
35 
36 /* LBER lengths (32 bits or larger) */
37 #define LBER_LEN_T int

该文件的其余部分声明该库使用的自定义变量类型,无需修改: ldap_config.hin

文件ldap_config.hin包含用于定义库应在哪里搜索LDAP客户端配置文件的模板。 由于iOS不允许用户在设备的文件系统内创建任意文件,因此不需要修改文件的内容。 确实需要将文件重命名为ldap_config.h,以便在源文件编译时不会由于包含指令失败而产生错误。 可以使用Xcode接口重命名该文件,方式与将lber_types.hin重命名为lber_types.h相同。

ldap_features.hin

ldap_features.hin包含有关iOS平台需要哪些功能的信息,以及有关OpenLDAP当前版本的信息。 将ldap_features.hin重命名为ldap_features.h并找到清单3中所示的以下行。

清单3. ldap_features.h
23 /* OpenLDAP API version macros */
24 #undef LDAP_VENDOR_VERSION
24 #undef LDAP_VENDOR_VERSION_MAJOR
24 #undef LDAP_VENDOR_VERSION_MINOR
24 #undef LDAP_VENDOR_VERSION_PATCH

OpenLDAP为每个发行版使用三部分版本号。 版本以XYZ格式表示,其中X是版本的主要供应商版本号,Y是版本的次要供应商版本号,Z是版本的供应商补丁修订版。 LDAP_VENDOR_VERSION的值是使用((X*10,000)+(Y*100)+(Z))的公式计算的。 例如,将使用清单4中显示的值来计算OpenLDAP 2.4.22的LDAP_VENDOR_VERSION

清单4.计算LDAP_VENDOR_VERSION
LDAP_VENDOR_VERSION_MAJOR = X = 2
LDAP_VENDOR_VERSION_MINOR = Y = 4
LDAP_VENDOR_VERSION_PATCH = Z = 22

LDAP_VENDOR_VERSION = ((X*10000)+(Y*100)+(Z))
LDAP_VENDOR_VERSION = ((2*10000)+(4*100)+(22))
LDAP_VENDOR_VERSION = (20000+400+22)
LDAP_VENDOR_VERSION = (20422)

ldap_features.h需要更新以反映OpenLDAP源代码的版本。 用#define替换#undef宏,然后插入版本信息。 例如,OpenLDAP 2.4.22将导致清单5所示的以下修改。

清单5.对OpenLDAP 2.4.22的修改
23 /* OpenLDAP API version macros */
24 #define LDAP_VENDOR_VERSION  20422
24 #define LDAP_VENDOR_VERSION_MAJOR 2
24 #define LDAP_VENDOR_VERSION_MINOR 4
24 #define LDAP_VENDOR_VERSION_PATCH 22

该文件的其余部分无需修改。

可移植的

有关iPhone SDK中可用的库函数和头文件的信息,需要在名为Portable.hin的文件中进行设置。 但是,此文件非常广泛,需要挖掘才能正确设置。 幸运的是,OpenLDAP使用autoconf对多个平台执行必需的测试。 autoconf脚本可用于生成Portable.hin的值。

要使用OpenLDAP autoconf脚本,请打开/Applications/Utilities/Terminal.app中的Terminal.app。 输入命令cd和一个空格。 然后将Xcode中包含OpenLDAP源代码树的文件夹拖到终端窗口中(参见图4 )。

图4.显示将Xcode组拖动到Terminal.app以获取文件夹路径的过程
显示将Xcode组拖动到Terminal.app以获取文件夹路径的过程

在键盘上按Enter键,将Terminal.app中的目录更改为OpenLDAP源树的位置。 使用清单6中显示的以下标志运行configure脚本。

清单6.运行configure脚本
./configure CC=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc \
   LD=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ld \
   --host=arm-apple-darwin --disable-slapd --without-cyrus-sasl \
   --without-tls --no-create

标志CC=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc指定iPhone SDK和LD=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ld使用的编译器的位置LD=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ld指定链接器的位置。 标志--host=arm-apple-darwin通知autoconf在哪个平台上将使用编译的代码。 标志--disable-slapd禁用构建OpenLDAP附带的LDAP服务器所需的检查。 iPhone SDK不包括Cyrus SASL库,OpenSSL库或GNU SSL / TLS库,因此标志--without-cyrus-sasl--without-tls禁止检查这些库中包含的功能。 最后,标志--no-create禁止autoconf创建Makefile和头文件。 输出应类似于图5

图5.运行配置脚本的前几行
配置脚本运行的前几行

运行以下命令以使autoconf从模板文件./config.status --header=include/portable.h:include/portable.hin生成./config.status --header=include/portable.h:include/portable.hin./config.status --header=include/portable.h:include/portable.hin

创建libldap.a

现在已经准备好了源代码和配置文件,是时候告诉Xcode LDAP库将使用哪些源文件了。 使用Xcode界面,将OpenLDAP源代码树导航到目录libldap(请参见图6 )。

图6. libldap源文件在Xcode的Groups&Files面板中的位置
libldap源文件在Xcode的“组和文件”面板中的位置

在libldap目录中,有一个名为Makefile.in的文件,其中包含用于构建libldap.a的文件的列表。 打开Makefile.in并找到清单7中所示的行。

清单7. Makefile.in
20 SRCS	= bind.c open.c result.c error.c compare.c search.c \
21 	controls.c messages.c references.c extended.c cyrus.c \
22 	modify.c add.c modrdn.c delete.c abandon.c \
23 	sasl.c gssapi.c sbind.c unbind.c cancel.c  \
24 	filter.c free.c sort.c passwd.c whoami.c \
25 	getdn.c getentry.c getattr.c getvalues.c addentry.c \
26 	request.c os-ip.c url.c pagectrl.c sortctrl.c vlvctrl.c \
27 	init.c options.c print.c string.c util-int.c schema.c \
28 	charray.c os-local.c dnssrv.c utf-8.c utf-8-conv.c \
29 	tls2.c tls_o.c tls_g.c tls_m.c \
30 	turn.c ppolicy.c dds.c txn.c ldap_sync.c stctrl.c \
31 	assertion.c deref.c

该列表中的文件需要更新以包含在ldap目标中。 为此,请右键单击列表中的文件,然后从出现的菜单中选择“ 获取信息”项。 在新窗口中,选择“目标”选项卡,然后从“目标成员资格”面板中单击ldap目标。 对整个文件列表重复此操作。

创建liblber.a

liblber.a是编译应用程序时libldap.a所需的库。 该库包含在OpenLDAP发行版中。 要构建该库,必须首先创建该库的Xcode目标。 要创建新目标,请右键单击Xco​​de的“组和文件”面板中的项目图标。 从菜单中选择添加 ,然后从辅助菜单中选择新建目标 。 将会出现“新建目标”向导。 从左侧的面板中选择Cocoa Touch ,然后从右侧的面板中选择Static Library 。 单击下一步按钮继续。 在“目标名称:”文本框中,键入lber ,然后单击“ 完成” 。 这应该创建新的库目标。

liblber.a取决于基金会框架。 要配置Foundation框架,请滚动到Xcode的“组和文件”面板中的“目标”部分。 展开“目标”部分,然后双击目标文件。 这将打开lber的目标信息窗口。 单击“常规”选项卡,然后单击“链接的库”面板下方的+按钮。 在弹出窗口中,从“设备-iPhone OS 4.1 SDK”部分中选择Foundation.framework。 单击添加按钮以完成将框架添加到库中。

最后,需要使用源文件配置Xcode以针对liblber.a进行编译。 使用Xcode界面,将OpenLDAP源代码树导航到目录liblber。 在liblber目录中,有一个名为Makefile.in的文件,其中包含用于构建liblber.a的文件的列表。

打开Makefile.in并找到清单8中所示的行。

清单8. Makefile.in中的行
21 UNIX_SRCS = stdio.c

26 SRCS= assert.c decode.c encode.c io.c bprint.c debug.c \
27 	memory.c options.c sockbuf.c $(@PLAT@_SRCS)

这些列表中的文件需要更新以包含在lber目标中。 为此,请右键单击列表中的文件,然后从出现的菜单中选择“ 获取信息”项。 在新窗口中,选择Targets选项卡,然后从Target Memberships面板中单击lber target。 对列表中的所有文件重复此操作。

可以通过单击Xco​​de工具栏中的“ 构建”按钮来构建该库。 要在为模拟器或设备构建之间切换,请从标记为Overview的下拉框中选择所需的SDK。

结论

与大多数软件开发方法一样,还有其他方法可以为iOS编译移植的库。 本文使用Xcode进行编译,以允许使用Xcode的依赖项跟踪将这些库轻松集成到其他程序包中,并允许使用iPhone SDK的将来版本轻松地更新这些库。

本系列的第2部分将展示如何创建第二个Xcode项目,并添加本文中创建的Xcode项目作为依赖项,并使用静态库为iPhone创建LDAP客户端。


翻译自: https://www.ibm.com/developerworks/aix/library/au-iphoneapp/index.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值