静态库.a 的编译和使用过程

了解html

许多时在项目中,每每对于积累沉垫下来不多改动的代码(高内聚,低耦合的代码),为了增长重用性,经常都进行库的封装好存。sql

在WIN上封装为DLL(动),LIB(静)。在LINUX上封装为.SO(动),.a(静)。iphone

IOS中静态库的方式有*.a或*.framework。不管是.a仍是.framework其实无外于对源码进行隐藏的一种表现方式ui

objc也由类库的概念,不过在在objc上通常叫库,库表示程序代码集合,能够共享给其余程序使用,库是编译后的二进制文件,所以不能看到源代码,多用于一些开放sdk(如百度地图sdk),商用库,debug

  objc上的库通常分为两类code

    静态库: .a 和 .frameworkhtm

      .a文件:纯二进制文件,须要配合.h文件一块儿使用,经过.h文件引用库里面的内容
      .framework文件:包含二进制文件blog

      连接时,静态库会被完整地复制到可执行文件中,例如iOS程序打包的时候会包含全部引用的静态库ip

    动态库: .dylib 和 .frameworkci

      iOS项目不支持动态库,每一个APP都是独立运行的,而且不能直接互相访问,APP只能访问系统自带的动态库,动态库系统只加载一次,并能够用于多个程序共享的,通常在用于桌面系统,连接时不会被添加到可执行文件,若是动态连接库不存在,程序可能执行失败

下面正文:

library search paths 库引用路径

other linker flags 编译标示参数

建立而且编译出静态库来。

1.建立本身的静态库

2.添加本身的类和category target->Build Phases ->Copy Files 点下面“+

”添加,通常的.h文件会自动引用,分类须要手动加进来.

3.设置支持的最低版本和最高版本  Build Settings ->Base SDK :当前类库是哪一个版本的SDK开发的,也就是最高支持的SDK

Deployment Target :类库支持的最低版本 Build Settings-> Deployment Target

4.配置编译选项:

因为编译的是类库,在使用时候须要支持Debug和Release俩种模式,须要编译全部的architecture版本

Build Settings-> Build Active Architecture Only  debug和Release都改成No.

4.编译Cmd+B

分别切换到模拟器和真机模式进行编译,在编译完成后,Products中的文件会变正常(原来为红色)。注意须要设置Build Release 版本

Edit -> Info -> Build Configuration  设置为Release

5.编译完成后获得多个.a文件,从Product下的.a 文件进入Finder查看

iphoneos真机用

iphonesimulator 模拟器用的。

使静态库同时支持模拟器和真机的方法:

1.合并.a文件

能够用lipo -create终端命令合并真机和模拟器的多个.a 文件,这样合并后的.a文件模拟器和真机都支持(合并后文件大小为原来俩个文件的大小之和)。

2.动态的引用静态库,经过配置工程的库引用路径和编译标示,编译的适合Xcode会根据当期的环境自动找到相关的.a库。

 

使用时:.a和.h文件都拖到项目中,Xcode会自动把静态库添加到工程,在Linkd Framework with Library里查看

 若是静态库里有category分类,那么须要在添加-ObjC编译标识,不然可能会报错:unrecognized selector sent to instance 

在other linker flags 里添加

 

终端命令:lipo -info查看文件信息  lipo -create 参数 参数 -output 参数 合并文件  pwd 获取当前所在文件路径

/Users/admin/Library/Developer/Xcode/DerivedData/libsql-gzhehbchiqciolgwkaazfwloklqq/Build/Products

~/Library/Developer/Xcode/DerivedData/libsql-gzhehbchiqciolgwkaazfwloklqq/Build/Products

.a文件文件信息: Architectures in the fat file: libsql.a are: i386 armv7 x86_64 arm64

进入文件目录下 ,而后lipo -info 文件名

合并俩个文件  lipo -create 第一个文件文件名 第二个文件文件路径 -output 合并后的文件名

好比:在/Build/Products/release-iphonesimulator下有liblibsql.a文件,在/Build/Products/release-iphoneos下也有liblibsql.a文件,想要合并这俩个文件,能够先进入/Build/Products/release-iphonesimulator文件下,而后

能够这么写:

lipo -create liblibsql.a /Build/Products/release-iphoneos/liblibsql.a -output libsql.a

结果是在/Build/Products/release-iphonesimulator文件下生成子文件libsql.a.

参考http://www.360doc.com/content/14/1215/17/19175681_433147141.shtml

http://www.cnblogs.com/bomo/p/4760177.html和http://www.cnblogs.com/bomo/p/4760791.html

相关文章
相关标签/搜索