iOS制作.a类型的静态库

简介: iOS制作.a类型的静态库

iOS制作.a类型的静态库

库(Library)其实就是一段编译好的二进制代码,加上头文件就可以供别人使用,一般会有两种情况要用到库:

1.某些代码需要给别人使用,但是我们不希望别人看到源码,就需要以库的形式进行封装,只暴露出头文件。

2.对于某些不会进行大的改动的代码,比方说很多大公司常用且很少变动的模块都会编译成库,这样做的好处一是可以节省编译时间,二来对于代码的管理也非常方便。

因为库是已经编译好的二进制文件了,编译的时候只需要link一下,既然提到了link那就有不同的形式了,静态和动态,与之相对应的就是静态库和动态库。

当然你代码含有大量图片资源,代码量不大并且需要精确适配不需要保密,一般就不使用库,直接使用私有组件。若代码量比较大,没有图片等资源需要精确适配,不希望别人看到源码,想减少编译时间可以使用静态库和动态库。简单的说是不希望别人看到源码就要使用库,反之可以使用普通私有组件。

基本知识:

库类别

静态库(.a 和.framework)

动态库(.liby和.framework)

2.静态库和动态库的区别

2.1静态库

平时我们用的第三方SDK基本上都是静态库。为何使用静态库,是因为静态库只要引入就能用,属于傻瓜式使用,它默认都配置到Linked Frameworks and Libraries下;而动态库需要你手动配置到Embedded Binaries下。


静态库在项目编译时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝。

静态库很大的一个优点是减少耦合性,因为静态库中是不可以包含其他静态库的,使用的时候要另外导入它的依赖库,最大限度的保证了每一个静态库都是独立的,不会重复引用。

静态库有.a 和 .framework两种形式。

2.2动态库

iOS平时使用的系统库基本是动态库,比如使用频率最高的UIKit.framework和Fundation.framework。

动态库在程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存。

动态库在制作的时候可以直接包含静态库,也能自动link所需要的依赖库。

动态库有.dylib/.tbd 、.framework两种形式。

苹果iOS8.0之前禁止开发中使用动态库

3.版本

真机-Debug版本

真机-Release版本

模拟器-Debug版本

模拟器-Release版本

区别

3.1 Debug

含完整的符号信息,以方便调试

不会对代码进行优化

3.2 Release

不会包含完整的符号信息

的执行代码是进行过优化的

的大小会比Debug版本的略小

基本操作:.a静态库制作

新建静态库工程

Create a New Xcode project -> Framework&Library -> Cocoa Touch Static Library


  1. 配置工程环境

2.1配置最低支持版本

为何支持的最低版本是8.0?并不是iOS8.0使用的有很多,实际上iOS8.0有很多配置和处理和iOS12差异很大,主要是因为苹果从iOS8.0开始支持动态库的。有的库需要同时生成动态库和静态库,为了兼容两种库的最低版本,那么只有从iOS8.0开始支持了,当然你也可以设置更高版本,游戏类的app对iOS最新版本一般要求比较高。

2.2设置适配所有模拟器架构重要

project -> buildSeting -> Build Active Architecture Only 设为NO

设置为默认的YES,那么只能支持指定版本的手机和模拟器了,所以这个一定要设置为NO。

3.设置为静态库

Mach-O Type一定要设置为Static Library,若你设置为其它的就悲剧了。这个属性是动态库和静态库的本质区别。

4. 新建公开的文件

4.1新建一个名为“TestTool 文件” 公开一个方法“TestLog”。像iOS使用动态库一样增加SDKDemoViewController页面控制器和MBProgressHUD类,SDKDemoBundle.bundle资源具体看demo中的代码。

TestTool.h

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface TestTool : NSObject
+(void)testLog;
@end

NS_ASSUME_NONNULL_END

TestTool.m

#import "TestTool.h"

@implementation TestTool

+(void)testLog
{
    NSLog(@"test static lib");
}
@end

4.2添加公开文件

4.2.1 点击“+”选择“ New Header Phase”

在这里插入图片描述

4.2.2 添加文件到 project

4.2.3 拖拽.h到 public

4.2.4在Copy Files下点击”+“增加生成的公开头文件,若不在这里增加就是你按照4.2.3增加了公开头文件,生成文件夹包里也没有公开头文件,这个很重要,很多的文章忽略了这一点。

5. 生成.a文件

此处注意需要生成4个

5.1修改环境

这里可以选择 Debug 和 Release 环境

4.2选择模拟器+Debug 环境+“cmd+R”生成.a;选择Generic iOS Device+Debug 环境+“cmd+R”生成.a;选择模拟器+Release 环境+“cmd+R”生成.a;选择Generic iOS Device+Release 环境+“cmd+R”生成.a。

当Products目录下的libSDKStaticDemo.a文件由红变黑说明生成一种类型的包。

此处注意需要生成4个

如此类推打出四种.a

真机-Debug版本

真机-Release版本

模拟器-Debug版本

模拟器-Release版本

最终生成结果

若没有按照4.2.4步骤操作那么你在SDKStaticDemo不能同时看到这四个公开文件。

5.3其中4个包下的include文件夹的文件都相同,所以只需要合并.a文件就可以。合并 debug 两个包和 release 两个包

注意:这里的合并指的是 1.debug 下真机+模拟器合并 2.release 下真机+模拟器合并

5.3.1将4个.a文件拷贝到单独文件夹

5.3.2 合并

打开终端 ,切换到4个.a文件所在的目录执行合并命令:

lipo -create libSDKStaticDemo-Debug-iphoneos.a libSDKStaticDemo-Debug-iphonesimulator.a -output libSDKStaticDemo-Debug.a

lipo -create libSDKStaticDemo-Release-iphoneos.a libSDKStaticDemo-Release-iphonesimulator.a -output libSDKStaticDemo-Release.a

执行如下命令效果如下:

w1:~ jiaguoshang$ cd /Users/jiaguoshang/Desktop/libSDKStaticDemo; clear; pwd
/Users/jiaguoshang/Desktop/libSDKStaticDemo
w1:libSDKStaticDemo jiaguoshang$ lipo -create libSDKStaticDemo-Debug-iphoneos.a libSDKStaticDemo-Debug-iphonesimulator.a -output libSDKStaticDemo-Debug.a
w1:libSDKStaticDemo jiaguoshang$ lipo -create libSDKStaticDemo-Release-iphoneos.a libSDKStaticDemo-Release-iphonesimulator.a -output libSDKStaticDemo-Release.a
w1:libSDKStaticDemo jiaguoshang$

合并后的文件如下:


目录
相关文章
|
2天前
|
数据采集 JavaScript Android开发
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
23 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
9月前
|
iOS开发
iOS使用.framework类型的静态库
iOS使用.framework类型的静态库
71 1
|
9月前
|
开发工具 iOS开发
iOS制作.framework静态库
iOS制作.framework静态库
94 1
|
9月前
|
iOS开发 Perl
iOS使用.a类型的静态库
iOS使用.a类型的静态库
73 1
|
9月前
|
开发工具 iOS开发 Perl
iOS使用SDK静态库
iOS使用SDK静态库
70 0
|
开发工具 iOS开发 Perl
iOS开发 - undefined symbols for architecture x86_64,大多数都是缺少静态库,缺少静态库分下面几种
iOS开发 - undefined symbols for architecture x86_64,大多数都是缺少静态库,缺少静态库分下面几种
200 0
iOS开发 - undefined symbols for architecture x86_64,大多数都是缺少静态库,缺少静态库分下面几种
|
iOS开发
iOS开发拓展篇—静态库
iOS开发拓展篇—静态库 一、简单介绍 1.什么是库?   库是程序代码的集合,是共享程序代码的一种方式   2.库的分类   根据源代码的公开情况,库可以分为2种类型   (1)开源库     公开源代码,能看到具体实现     比如SDWebImage、AFNetworking...
829 0
|
iOS开发
在iOS开发中使用静态库(Static Library)
引言: 静态库是一个(.a)为后缀的文件,它由Xcode编译生成.并且,库中只能存放代码,如果编译静态库的工程中有其他资源是无法一起编译到静态库中.静态库有点类似Windows中的Dll文件.
1352 0
|
1月前
|
iOS开发 开发者
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
141 67
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决

热门文章

最新文章

  • 1
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    23
  • 2
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    21
  • 3
    uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
    141
  • 4
    【05】2025年1月首发完整版-篇幅较长-苹果app如何上架到app store完整流程·不借助第三方上架工具的情况下无需花钱但需仔细学习-优雅草央千澈详解关于APP签名以及分发-们最关心的一篇来了-IOS上架app
    222
  • 5
    app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
    87
  • 6
    深入探索iOS开发中的SwiftUI框架
    143
  • 7
    ios样式开关按钮jQuery插件
    58
  • 8
    Android与iOS生态差异深度剖析:技术架构、开发体验与市场影响####
    74
  • 9
    深入探索iOS与Android操作系统的安全性差异
    102
  • 10
    安卓与iOS开发中的跨平台策略:一次编码,多平台部署
    173