一、.a 文件静态库打包

  1. 打开 Xcode 创建一个新的 Static Library 工程,取名 MyStaticLibrary。

  2. 创建工程完毕后,系统自动创建了一个同名类,添加一个方法用于测试。

    #import <Foundation/Foundation.h>
    @interface MyStaticLibrary : NSObject
    + (void)test;
    @end
    @implementation MyStaticLibrary
    + (void)test
    {
    NSLog(@"sssss");
    }
    @end
  3. Command + B 运行工程进行打包。运行完毕后,在工程中 Products 文件夹下的 libMyStaticLibrary.a 文件由红色变成了黑色。右键 show in finder 可以在其目录下找到它。这就是我们打包好的 .a 静态文件。

    接下来公开些接口或者头文件供人调用。

  4. 公开接口头文件

    targets -> Build Phases -> Copy Files -> "+" 添加你需要公开的头文件。可以多添加几个类。

    公开头文件后,Command + B 重新运行打包,我们会得到一个 include 文件夹和一个 .a 静态库。

  5. 新建一个可运行的工程,把这两个打包好的文件拖入项目测试。

    选择 iPhone7 模拟器运行,运行程序,看到日志输出没有问题,即打包.a静态库大功告成。

    别高兴的太早。当把模拟器切换成 iPhone5 运行时,编译直接不通过,报错如下:

    Undefined symbols for architecture i386 的意思是 libMyStaticLibrary.a 静态库不支持 i386 架构,即 32 位模拟器。

    iPhone5 模拟器正好是 i386 架构,打包的静态库不支持。但是 iPhone7 模拟器运行却没有问题,这说明打包的静态库支持 iPhone7 模拟器的 cpu 架构 x86_64。如何查看静态库所支持的架构,请看下一步。

  6. 终端查看静态库所支持的架构

    终端 -> cd 进入库文件路径 -> lipo -info 库名

    可以看到静态库仅支持 x86_64 架构,所以运行 iPhone5 模拟器时,编译会报错。

  7. 设置适配所有模拟器架构

    project -> buildSeting -> Build Active Architecture Only 设为 NO,Valid Architectures 添加 arm7、arm7s 等架构,注意工程 iOS Deployment Target 设置为较低版本,如 8.0,不然不会有 i386。

    设置完成后,重新 Command + B 运行打包静态库文件(这时你可随便选一个模拟器),按照上述第 6 步终端查看其支持的架构,我们可以看到终端输出的结果是同时支持 i386 和 x86_64,这也就意味着同时支持所有模拟器。

    到这里打包 .a 静态库已经告一段落,但是按上述流程打包的只能在模拟器上跑,真机是不能运行的,因为 ios 真机设备跟模拟器的架构又不一样,继续处理。

  8. 打包支持真机架构的静态库

    所有流程都跟上面的一样,只是我们运行打包时要选择真机运行,如下图你可以选择自己插上去的真机,也可以选择 Generic ios Devices。当然不要忘记了设置支持所有真机机型架构: Build Active Architecture Only 设为 NO。

    看下打包出来的终端查看结果如下:

    可以看到同时支持 armv7 和 arm64,也就是支持所有 ios 设备。好了到此打包 .a 静态库算是告一段落。

    如果要同时支持模拟器和真机,请使用命令合成 .a 静态库:

    lipo -create \[name1.a 所在路径\] \[name2.a 所在路径\] -output \[newname.a\]

二、.frameworke 文件静态库打包

  1. Xcode 创建一个新的工程 MyFrameworkLib,选择工程如下:

    创建完成后我们可以看到,工程本身自带一个 MyFrameworkLib.h 文件,这是类似一个主头文件一样的东西

  2. 创建需要测试的类。

    #import <Foundation/Foundation.h>
    @interface MyFramework : NSObject
    + (void)test;
    @end
    @implementation MyFramework
    + (void)test
    {
    NSLog(@"sssss");
    }
    @end
  3. 设置支持所有模拟器架构或真机架构(和打包 .a 第 7 步骤一样)

  4. 公开头文件

    target -> Build Phases -> Headers -> 把需要公开的头文件从 project 拖入 Public。

  5. 设置打包的是静态库。

    因为动态库也可以是以 framework 形式存在,所以需要设置,否则默认打出来的是动态库(注意:如果要上线 AppSotre,一定要改成静态库,否则审核通不过)

    target -> BuildSetting -> 搜索关键字 mach-> Mach-o Type 设为 Static Library(这个默认选项是动态的)

  6. 选中真机或模拟器运行设备打包(与打包 .a 一样),完成后 Products 文件夹下的 MyFrameworkLib.framework 文件由红色变成了黑色,右键 show in finder 显示如下:

    MyFrameworkLib.framework 拖入项目便可直接使用。此外还要补充的一点是,打包静态库的时候还需注意打包的是测试版(Debug)还是发布版(Release),这个根据你自己的需求决定,而如何进行设置请下一步骤。

  7. 设置打包静态库的测试版和发布版(.a 和 .frameworke)

    product -> scheme -> Edit scheme -> Run -> 选择 Debug 或 Release。

    如果要同时支持多种架构,和 .a 类似,需要设置 Build Activ Architecture Only = NO 和 iOS Deployment Target。

    如果要同时支持模拟器和真机,和 .a 类似,使用命令合成 framework 库:lipo -create [.framework/] [.framework/] -output newname

    将生成的 MyLib 替换掉任何一个里面的 MyFrameworkLib 文件。

iOS 构建静态库的更多相关文章

  1. 手淘架构组最新实践 | iOS基于静态库插桩的⼆进制重排启动优化 抖音研发实践:基于二进制文件重排的解决方案 APP启动速度提升超15% 编译期插桩

    抖音研发实践:基于二进制文件重排的解决方案 APP启动速度提升超15% 原创 Leo 字节跳动技术团队 2019-08-09 https://mp.weixin.qq.com/s/Drmmx5JtjG ...

  2. 《CMake实践》笔记三:构建静态库(.a) 与 动态库(.so) 及 如何使用外部共享库和头文件

    <CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...

  3. xcode6制作IOS .a静态库小记

    xcode6制作IOS .a静态库小记 创建iOS静态库 简单写个打印的代码 编码完成之后,直接Run就能成功生成.a文件了,选择 xCode->Window->Organizer-> ...

  4. iOS基础 - 静态库

    一.什么是库? 库是共享程序代码的方式,一般分为静态库和动态库. 二.静态库与动态库的区别? 静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝. 动态库:链接时不复制,程序运行时由系 ...

  5. iOS 构建动态库

    一.构建步骤 创建一个动态库 MyDynamicFramework 创建一个测试类 在 MyDynamicFramework.h(默认生成,可统一暴露头文件) 中 #import "Pers ...

  6. iOS生成静态库方法

    在iOS的开发过程中,我们常常用到第三方的库.比如支付.地图.广告等. 那么,如何制作自己的库文件呢? 如何将自己写的功能类编译成库文件,分发给其他人来使用呢并做成通用库里? iOS开发一年多来没有制 ...

  7. (转)HelloWorld CMake CMake中构建静态库与动态库及其使用

    继续完善Hello World,建立它的共享库, 包括静态库和动态库. 本节的任务: 1,建立一个静态库和动态库,提供HelloFunc函数供其他程序编程使用,HelloFunc 向终端输出Hello ...

  8. iOS中静态库-.a文件生成和使用

    最近在使用使用一个网上的Demo的时候. 出现另一令人烦恼的问题 . 就是它里面有嵌套的工程. 如下图所示. 工程里面还嵌套有一个工程. 真的是让人煞费苦心 …其实这个问题看起来并不是很难, 如果是一 ...

  9. iOS打包静态库(完整篇)

    1. 什么是库? 所谓库就是程序代码的集合,是共享程序代码的一种方式. 2. 库的分类 根据程序代码的开源情况,库可以分为两类 开源库源代码是公开的,你可以看到具体实现.比如GitHub上比较出名的第 ...

随机推荐

  1. 移动端轮播图实现方法(dGun.js)

    本文章介绍在移动端无缝隙轮播图实现的原理,这个轮子比较简单,但可以方便刚刚入门的同学参考.最终效果是在移动端无缝隙无限滑动,可以自定义轮播的速度.支持手势左右滑动.最后会放上源码. HTML部分 &l ...

  2. JavaScript 工作原理之十三-CSS 和 JS 动画底层原理及如何优化其性能

    原文请查阅这里,本文采用知识共享署名 4.0 国际许可协议共享,BY Troland. 本系列持续更新中,Github 地址请查阅这里. 这是 JavaScript 工作原理的第十三章. 概述 正如你 ...

  3. js事件委托target

    **看一看,瞧一瞧!** 话说要谈事件委托和target.那我们首先来看看什么是事件.话说什么是事件呢?一般的解释是比较重大.对一定的人群会产生一定影响的事情.而在JavaScript中就不是这样了, ...

  4. docker 学习路线

    docker 学习路线 参考资料 知乎 docker 的学习路线 Docker - 从入门到实践 Docker 核心技术与实现原理 Docker 入门 <Kubernetes in Action ...

  5. seo搜索优化技巧01-seo外链怎么发?

    在seo搜索优化中,seo外链的作用并没有早期的作用大了.可是高质量的外链对关键词的排名还是很重要的.星辉信息科技对seo外链怎么发以及seo外链建设中的注意点进行阐述. SEO外链如何做 SEO高质 ...

  6. html标签及网页语义化理解

    最近重新看了一遍html标签的知识,有很多新的体会,对语义化有了一个新的理解. 那么什么叫做语义化呢,说的通俗点就是:明白每个标签的用途(在什么情况下使用此标签合理)比如,网页上的文章的标题就可以用标 ...

  7. MATLAB神经网络(7) RBF网络的回归——非线性函数回归的实现

    7.1 案例背景 7.1.1 RBF神经网络概述 径向基函数是多维空间插值的传统技术,RBF神经网络属于前向神经网络类型,网络的结构与多层前向网络类似,是一种三层的前向网络.第一层为输入层,由信号源结 ...

  8. 双列集合Map相关面试题

    一.了解Map集合吗?Map集合都有哪些实现 HashMap HashTable LinkedHashMap TreeMap ConcurrentHashMap 二.HashMap和HashTable ...

  9. 【tomcat系列】详解tomcat架构(上篇)

    java中,常用的web服务器一般由tomcat,weblogic,jetty,undertwo等,但从用户使用广泛度来说,tomcat用户量相对比较大一些,当然这也基于它开源和免费的特点. 从软件架 ...

  10. 第一个android App, hello world

    自以为按照教程很快就会创建自己第一个android App,没想到还是用了很长时间,中间走了很多坑,记下来,这也算自己的一个成长吧 首先按照官方的教程,新建一个工程 https://developer ...