iOS 静态库——制作Framework

  

 动态库与静态库的制作流程基本一样,包括头文件的暴露等,唯一不同的是Mach-O文件的编译形式。

 

 1、这里要选Framework,如果选择右边的Static Library制作出来的是framework静态库。

 

 

  导入所有要打包的文件。

 

 

2、将头文件公布出去,供外界使用,所有的编译文件都在Project中,需要右击添加到public里面

 

3、 把项目的membership需改为public,一般默认就是public。

 

制作成功后 通常我们导入的头文件 就是 StaticFramework.h  例如:#import <StaticFramework/StaticFramework.h> , 所以:

可以在此文件下提前写入常用类的 头文件,比如AFNetworking.h 就可以写入进来。

 

 

4、link依赖的系统库。如:JSPath 的依赖框架有 libz.dylib 和 JavaScriptCore.framework

 

 

 5、 选择Mach-O的编译方式,这一步决定我们制作出来的是静态库还是动态库,默认选择的是Dynamic Library,要手动选择Static Library。

(如果需要制作动态库,只需要将Mach-O的形式改为Dynamic Library就可以了,其他步骤一样)

 

 

6、Edit Scheme 改为release 快捷键 command + shift + <     

    

 

 

7、 xcode 连上手机,选择真机设备,command + b 编译一下,然后Products 里面的framework 文件(真机状态编译后,由红变黑),  show in finder 可以看到编译产生的包。

  (模拟器和真机的framework是分开的,要分开制作。注意建议先选择真机,这样才会变色。

   如果先选择模拟器,那么编译通过了,但是不会由红变黑,实际上是已经编译了模拟器的,只是给人一种假象,好像没编译一样,还是红色的。

   我这里就是先编译模拟器,后编译了真机,结果没有红色变黑色)。

 

  注: 编译前检查一下是debug模式还是release模式,选择release模式:

  • 分debug和release模式:
  • Debug-iphoneos 文件夹里面的东西是用在真机上的
  • Debug-iphonesimulator 文件夹里面的东西是用在模拟器上的
  • 如果 Scheme 是 Release 模式,生成的文件夹就以 Release 开头

 

 

然后 xcode 选择模拟器,重新 command + b 编译,

Products 里面的framework 文件 show in finder 可以看到编译产生的真机包 和 模拟器包

 

 

    

9、合并模拟器(release-iphonesimulator)和真机(release-iphoneos)下的framework,以便支持真机和模拟器,合并后的framework大小大约是不合并的2倍左右。

 

合并的命令

格式: lipo -create 【模拟器打包path】 【真机打包path】 -output 【导出兼容版本path】 每个单词之间加空格

 

lipo -create /Users/mac/Desktop/dabao/Release-iphonesimulator/StaticFramework.framework/StaticFramework  /Users/mac/Desktop/dabao/Release-iphoneos/StaticFramework.framework/StaticFramework  -output /Users/mac/Desktop/dabao/StaticFramework

 

路径太长,下面有个简单的方式:(每一步记得要用空格隔开,不要遗漏了)

a1、新建文件夹:"dabao";

a2、将上述的release-iphonesimulator和release-iphoneos两个文件拷贝进"dabao"文件夹

a3、在终端输入:lipo  -create

a4、将release-iphonesimulator下.framework 里面的 framework 拖进终端,输入一个空格;

a5、继续将release-iphoneos 下.framework 里面的 framework 拖进终端,输入空格

a6、继续输入:-output ,打个空格

a7、输入合并后的framework所要放的文件路径,这里举例依然放在“dabao”这个文件夹下,则我的电脑的路径为:

/Users/mac/Desktop/dabao/StaticFramework, 回车,在相应的文件下即可生成一个文件,该文件即是合并后的静态库.

 

 

10、合并完成后,可以把 模拟器(release-iphonesimulator)和真机(release-iphoneos)任意一个文件夹下的 .framework 中的 StaticFramework 替换一下,这个.framework 就可以使用了。

例如:模拟器下的静态库,用1 把 2 给替换掉, 3就是制作好的静态库。

 

 

 

到此  framework 库 就成功制作出了,此时只要将这个文件夹提供给外界使用就可以了。

使用时导入头文件: #import <StaticFramework/StaticFramework.h>  

 

  

二、常见问题

 
问题1:

如果你的依赖库里面有lib开头的dylib动态库,编译(command+b)时应该会报错。

 

原因:动态库链接报错,大概就是没找到对应的库文件,因为tbd是苹果提供的新的动态库格式,之前都是dylib。
 

解决办法:

先把原来的.tbd删掉,然后再次添加,这个时候选择add other,在弹出的窗口中按快捷键shift + command + G 调出finder的前往窗口,输入/usr/lib,然后添加相应的dylib动态库。

 
 
 问题2:

问: 静态库中可以包含静态库?

答:静态库是没有办法融合静态库的,只能以依赖库的形式,静态库是不能真正的包含静态库的,它不像动态库,第三方静态库还需要以依赖库的形式提供给外界。动态库不存在这样的问题。

 

 

 github 地址:https://github.com/lc081200/makeStaticFramework

 

相关阅读】:

1、iOS 静态库——理论

2、iOS 静态库——framework制作

3、iOS 静态库——.a制作

 

 

 


 参考链接:

 http://www.jianshu.com/p/155a3cfb765e?utm_campaign=hugo

 

posted on 2017-07-25 10:12  iRemark  阅读(523)  评论(0编辑  收藏  举报

导航