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

了解

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

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

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

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

  objc上的库一般分为两类

    静态库: .a 和 .framework

      .a文件:纯二进制文件,需要配合.h文件一起使用,通过.h文件引用库里面的内容
      .framework文件:包含二进制文件

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

    动态库: .dylib 和 .framework

      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

转载于:https://my.oschina.net/u/2560887/blog/751102

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值