zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    ElementUI 之 Message,自动弹出,信息不显示问题
    eslint 对下一行不要校验报错
    <input type="file"> accept属性筛选文件类型
    纯 css 控制隔行变色
    本地启动服务,两个进程分别监听两个端口,导致两个 URL 不同
    tap 事件会触发两次问题
    时间宝贵-----
    有些人,得到和失去,你都会后悔!
    前调清新,中调醇厚,后调悠长。
    office 格式定义
  • 原文地址:https://www.cnblogs.com/saytome/p/7232529.html
Copyright © 2011-2022 走看看