创建及使用静态库(.a)的步骤整理

来源:互联网 发布:92kaifa 域名秀 编辑:程序博客网 时间:2024/06/04 00:46

     库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行

如果你作为iOS开发者已经有一段时间,可能会有一套属于自己的类和工具函数,它们在你的大多数项目中被重用。
 
重用代码的最简单方法是简单的 拷贝/粘贴 源文件。然而,这种方法很快就会成为维护时的噩梦。因为每个app都有自己的一份代码副本,你很难在修复bug或者升级时保证所有副本的同步。
 
这就是静态库要拯救你的。一个静态库是若干个类,函数,定义和资源的包装,你可以将其打包并很容易的在项目之间共享。



一.创建.a静态库
1.
2.添加自己的源代码   将公开的接口置于.h文件中  实现置于.m文件

3.在.a库的showinfindjr中可以找到  include 和 对应的 .a文件

4.默认情况下,库文件只会为当前的架构构建  所以要使用通用二进制 来使支持多个平台

4.1 通用二进制是一种特殊的二进制文件,它包含对应多个架构的结果代码。为了创建通用二进制库,需要使用一个名为lipo的系统工具   lipo是一个命令行工具,它允许在通用文件上执行操作(类似于创建通用二进制, 列出通用文件内容等等)。本教程中使用lipo的目的是联合不同架构的二进制文件到单个输出文件中。你可以直接在命令行中使用lipo命令,但在本教程中你可以让Xcode执行一段创建通用库的命令行脚本来为你做这件事。

4.2 
4.3 
在工程导航视图中选中ImageFilters,然后选择UniversalLib目标。切换到Build Phases标签;在这里设置构建目标时将要执行的动作。
 
点击Add Build Phase按钮,在弹出的菜单中选择Add Run Script,如下图:

4.4  原理 :; 
现在你需要设置脚本项。展开Run Script模块,在Shell行下粘贴如下代码:
  1. # define output folder environment variable 
  2. UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal 
  3.   
  4. # Step 1. Build Device and Simulator versions 
  5. xcodebuild -target ImageFilters ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos  BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" 
  6. xcodebuild -target ImageFilters -configuration ${CONFIGURATION} -sdk iphonesimulator -arch i386 BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" 
  7.   
  8. # make sure the output directory exists 
  9. mkdir -p "${UNIVERSAL_OUTPUTFOLDER}" 
  10.   
  11. # Step 2. Create universal binary file using lipo 
  12. lipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/lib${PROJECT_NAME}.a" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/lib${PROJECT_NAME}.a" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/lib${PROJECT_NAME}.a" 
  13.   
  14. # Last touch. copy the header files. Just for convenience 
  15. cp -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/include" "${UNIVERSAL_OUTPUTFOLDER}/" 
 
代码并不十分复杂,它是这样工作的:
UNIVERSAL_OUTPUTFOLDER 包括了通用二进制包将要被存放的文件夹:“Debug-universal”
 
Step 1. 第2行执行了xcodebuild并命令它构建ARM架构的二进制文件。(你可以看到这行中的-sdk iphoneos参数)
下一行再次执行了xcodebuild命令并在另一个文件夹中构建了一个针对Inter架构的iPhone模拟器的二进制文件,在这里关键参数是-sdk iphonesimulator -arch i386。(如果感兴趣,你可以在man page了解更多关于xcodebuild的资料)
 
Step 2. 现在已经有了2个.a文件分别对应两个架构。执行lipo -create,用它们创建出一个通用二进制。
 
最后一行的作用是复制头文件到通用构建文件夹的外层。(用cp命令)
 
你的Run Script窗口应该看起来如下:
4.5  现在你已经准备好构建一个静态库的通用版本
 
5 在应用中使用静态库
有两种办法可以将静态库引入到工程中:
方法 1: 直接引用头文件和库二进制文件(.a)
方法 2: 将库工程作为子项目
方法 1: 头文件和库二进制文件
1.用showinfound开自己创建的静态库 将里面的.h 和 .a 文件赋值到新项目的实体文件中去  再通过下面的方法来设置路径来实现对静态库的调用
注意: 标准的Unix引入惯例是一个include文件夹,用来存放头文件,一个lib文件夹用来存放库文件(.a)
2.添加头文件的搜索路径Header Search Path
双击Header Search Paths项,弹出一个浮动窗口,点击+按钮,输入:
  1. $SOURCE_ROOT/include 
$SOURCE_ROOT是一个Xcode环境变量,指向工程根文件夹。Xcode会使用包含你工程的实际文件夹代替此变量,这意味着即使你把工程移动到其它文件夹或驱动器,它仍然可以指向最新的位置。
3.添加包含类实现的库文件
该链接尝试更高效的只包含需要的代码,而有时会排除静态库代码。使用该标识,库中的所有Objective-C类和类别都将被适当的加载。你可以从苹果的Technical Q&A QA1490了解详细信息。


4.在 Other linker Flags 增加-ObjC链接标识


方法 2: 将静态库作为子项目添加到新的项目中
1.将自建的库工程文件的.xcodeproj文件,拖拽它到新工程左侧的导航栏中
2.为工程添加依赖关系

3.设置静态库工程链接到应用


4.在 Other linker Flags 增加-ObjC链接标识










0 0
原创粉丝点击