静态库

n静态库

n简介

n什么是库?

p库是程序代码的集合,是共享程序代码的一种方式

p

n根据源代码的公开情况,库可以分为2种类型

p开源库

ü公开源代码,能看到具体实现

ü比如SDWebImage、AFNetworking

p闭源库

ü不公开源代码,是经过编译后的二进制文件,看不到具体实现

ü主要分为:静态库、动态库

n静态库和动态库

n静态库和动态库的存在形式

p静态库:.a 和 .framework

p动态库:.dylib 和 .framework

p

n静态库和动态库在使用上的区别

p静态库:链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝(左图所示)

p动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存(右图所示)

n制作.a

n选择“Cocoa Touch Static Library”

n制作.a

n输入静态库名称

n制作.a

n添加库需要包含的源代码

n制作.a

n选择需要暴露出来的.h文件,.m文件会自动编译到.a文件中

n制作.a

n选择真机设备,然后 Command+B 编译,libMJRefresh.a文件从红色变为黑色

n制作.a

n选择模拟器,依然 Command+B ,模拟器和真机环境下用的.a文件是分开的

n制作.a

n右击“Show In Finder”,查看制作好的.a文件

n.a的制作

n如果想让一个.a文件能同时用在真机和模拟器上,需要进行合并

p在终端输入指令

lipo -create Debug-iphoneos/libMJRefresh.a Debug-iphonesimulator/libMJRefresh.a -output libMJRefresh.a

ü蓝色部分是固定指令

ü红色、紫色是真机和模拟器.a文件的路径

ü绿色是所合成.a文件的路径

ü

n.a文件的体积(一般情况下)

p真机用的.a > 模拟器用的.a

p所合成.a == 真机用的.a + 模拟器用的.a

p

n通过lipo –info libMJRefresh.a可以查看 .a 的类型(模拟器还是真机)

n使用.a

n如何使用.a

p直接将.a、.h、资源文件拖拽到其他项目中即可

n手工制作.framework

n选择“OS X”-“Framework & Library”-“Bundle”

n手工制作.framework

n输入静态库名称

n手工制作.framework

n刚才是基于OS X创建的工程,所以得修改项目环境为iOS的

n手工制作.framework

n修改Linking

n手工制作.framework

n修改Packaging

n手工制作.framework

n修改Info.plist

n手工制作.framework

n注释掉pch文件的内容

n手工制作.framework

n添加库需要包含的源代码

n手工制作.framework

n添加需要暴露出来的 .h 文件

n手工制作.framework

n添加需要暴露出来的 .h 文件,并且放到Public下面

n手工制作.framework

n接下来的步骤跟 .a 是一样的,分别选择真机和模拟器,Command+B

n真机和模拟器下的 .framework 也是分开使用的

n

n生成的framework在Xcode的缓存文件夹中

/Users/用户名/Library/Developer/Xcode/DerivedData/项目名/Products

n

n可以在终端下使用lipo指令合并 .framework, 需要合并的是framework里面的某个文件

n手工制作.framework

n直接拖拽整个 .framework 到其他项目的Frameworks文件夹下

n然后包含主头文件:#import <MJRefresh/MJRefresh.h>

n模板制作.framework

n手工制作 .framework 过于复杂,借助开源模板进行制作会比较简单

n

n模板地址

phttps://github.com/kstenerud/iOS-Universal-Framework

n

n安装模板

p在终端下进入iOS-Universal-Framework/Fake Framework文件夹

p执行指令./install.sh

n模板制作.framework

n安装模板后,完全重启Xcode

n模板制作.framework

n最后将 .framework 的结构调整一下即可

n制作静态库的注意点

n无论是 .a 静态库还是 .framework 静态库,最终需要的都是:

p二进制文件 + .h + 其它资源文件

n.a 和 .framework 的使用区别

p.a 本身是一个二进制文件,需要配上 .h 和 其它资源文件 才能使用

p.framework 本身已经包含了 .h 和 其它资源文件,可以直接使用

p

n图片资源的处理

p如果静态库中用到了图片资源,一般都放到一个bundle文件中,bundle名字一般跟 .a 或 .framework 名字一致

pbundle的创建:新建一个文件夹,修改扩展名为 .bundle 即可,右击bundle文件,显示包内容,就可以往bundle文件中放东西

n制作静态库的注意点

n多文件处理

p如果静态库需要暴露出来的 .h 比较多,可以考虑创建一个主头文件

(一般 主头文件 和 静态库 同名)

p在主头文件中包含所有其他需要暴露出来的 .h 文件

p使用静态库时,只需要#import 主头文件

p实际上苹果官方就是这么做的,例如:#import <UIKit/UIKit.h>

p

n.framework为什么既是静态库又是动态库

p系统的 .framework 是动态库

p我们自己建立的 .framework 是静态库

n制作静态库的注意点

n静态库中包含了Category

p如果静态库中包含了Category,有时候在使用静态库的工程中会报“方法找不到”的错误(unrecognized selector sent to instance)

p解决方案:在使用静态库的工程中配置Other Linker Flags为-ObjC

n

时间: 2024-12-23 10:44:01

静态库的相关文章

在iOS中创建静态库

如果你作为iOS开发者已经有一段时间,可能会有一套属于自己的类和工具函数,它们在你的大多数项目中被重用. 重用代码的最简单方法是简单的 拷贝/粘贴 源文件.然而,这种方法很快就会成为维护时的噩梦.因为每个app都有自己的一份代码副本,你很难在修复bug或者升级时保证所有副本的同步. 这就是静态库要拯救你的.一个静态库是若干个类,函数,定义和资源的包装,你可以将其打包并很容易的在项目之间共享. 在本教程中,你将用两种方法亲手创建你自己的通用静态库. 为了获得最佳效果,你应该熟悉Objective-

linux c: 静态库和动态库的生成和使用

场景: main函数需要两个接口,一个求和函数,一个打印函数. int sum(int i, int j); 求两个int数字的和. void show(int i, char* name); 打印i的值和它的名称. 现在,需要制作: 一个静态库libcalc.a,提供sum的接口; 一个动态库libshow.so,提供show的接口. #include <stdio.h> #include "calc.h" #include "show.h" int

静态库和动态库的分析

本质上来说库是一种可执行代码的二进制形式. linux下的库有两种:静态库和共享库(动态库) 静态库在程序编译时会被连接到目标代码中:程序运行时将不再需要该静态库,因此体积较大. 优点:程序运行时将不再需要该静态库 缺点:可执行文件的体积较大. 相同的库可能会需要被多次加载. 静态库: libxxxxx.a 动态库:动态库在程序编译时并不会被连接到目标代码中, 优点: 在程序运行时动态库才会被载入内存,因此代码体积较小. 缺点: 因此在程序运行时还需要动态库存在. 静态库的制作:将功能函数编译成

iOS 静态库制作及使用问题

参考:http://blog.163.com/const_yixinyiyi/blog/static/180088172201211113333882/ 静态库使用目标:(.a ) > 自己制作一个静态库(可以使用)(前三步) > 制作模拟器版本和真机版本 (第四步) > 合并两个版本 (第六步) 创建静态库步骤: 1. 选择要创建的文件类型:Cocoa Touch Static Library (.a文件) 2.将需要封装的文件导入其中 选择工程找到target(静态库) ->

iOS 中的静态库与动态库,区别、制作和使用

如果我们有些功能要给别人用,但是又不想公开代码实现,比如高德地图.第三方登录分享等等,这时候我们就要打包成库了.库分静态库和动态库两种: 静态库:以.a 和 .framework为文件后缀名.动态库:以.tbd(之前叫.dylib) 和 .framework 为文件后缀名. 静态库与动态库的区别 静态库:链接时会被完整的复制到可执行文件中,被多次使用就有多份拷贝.动态库:链接时不复制,程序运行时由系统动态加载到内存,系统只加载一次,多个程序共用(如系统的UIKit.framework等),节省内

用Visual Studio2017写静态库

造轮子是一件有趣的事情,VS是一个强大的工具,能胜任超大规模的工程,但是讲真,对不那么大的项目配置起来不是那么友好(网上的其他教程也一点都不友好Orz).这里就展示一下构建一个简单的静态库的正确姿势.(顺便教一点道理 创建解决方案--许多人搞不清工程/项目Project和解决方案Solution的区别,在VS中,Project是基本的执行单元,一个Solution可以包含多个Project--我们的静态库就将会包含几个(.lib)Project和一个(.exe)Project用作测试.解决方案选

Linux 静态库与动态库

静态库(.a) 一个deal.c  usedeal.c 重点 1. gcc -c deal.c 生成 deal.o 2. ar -rsv libdeal.a  deal.o 生成 libdeal.a 2.5  可以通过ar  -t libdeal.a 看一个静态库都包含哪些obg文件 3. gcc -o usedeal usedeal.c -L./ -ldeal 生成可执行程序usedeal 4. ./usedeal 动态库(.so) usedeal.c deal.h 动态链接 1 生成.o文件

linux上静态库和动态库的编译和使用(附外部符号错误浅谈)

主要参考博客gcc创建和使用静态库和动态库 对于熟悉windows的同学,linux上的静态库.a相当于win的.lib,动态库.so相当于win的.dll. 首先简要地解释下这两种函数库的区别,参考<Linux程序设计> 1. 静态库也被称为归档文件(archive,因此创建命令是ar),编译器和链接器负责将程序代码和静态库结合在一起组成单独的可执行文件: 但是缺点是许多应用程序同时运行并使用来自同一个静态库的函数时,内存中就会有一个函数的多份副本,而且程序文件自身也有多份同样的副本,这将消

Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf 动态库的后缀为*.so 静态库的后缀为 libxxx.a ldconfig 目录名

Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf  动态库的后缀为*.so  静态库的后缀为 libxxx.a   ldconfig   目录名 转载自:http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻.在这之前,我们需要了解一下源代码到可执行程序之间到底发生了什么神奇而美妙的事情. 在Linux操作系统中,普遍使用ELF格

详解Xcode7中创建静态库

今天和大家一起来谈谈Xcode中的静态库,包括什么是静态库,如何在Xcode中创建静态库等内容,希望这篇Xcode教程 http://www.maiziedu.com/course/234/对打击有帮助. 一.静态库和动态库的区别: 静态库和动态库是相对编译期和运行期的,静态库以 .a 和 .framework 形式存在,链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝:动态库以 .dylib 和 .framework 形式存在,链接时不复制,程序运行时由系统动态加载到内存