iOS:Xcode7创建静态库

Xcode7 中创建静态库

一、简单介绍

1.什么是库?

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

2.库的分类

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

  (1)开源库

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

    比如SDWebImage、AFNetworking

  (2)闭源库

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

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

二、静态库和动态库

1.静态库和动态库的存在形式

静态库:.a 和 .framework

动态库:.dylib 和 .framework

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

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

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

三、静态库简介:

1、静态库分为:

真机—Debug(调试)版本、

真机—Release(发布)版本、

模拟器—Debug版本、

模拟器—Release版本;

开发中一般都打包Release(发布)版本,将真机和模拟器版本合并,提供外界。

2、使用场景:在项目开发的过程中,例如两个公司之间业务交流,不可能把源代码都发送给另一个公司,这时候将私密内容打包成静态库,别人只能调用接口,而不能知道其中实现的细节。

四、用Xcode7创建静态库

.a文件版本(以制作SDWebImage静态库为例)

1、新建项目,点击iOS—Framework&—Cocoa Touch Static Library。

给你的工程命名为SDWebImageStaticLib

2、系统自动生成以工程名命名的.h和.m文件,可自定义的在目录下添加或删除文件,注意目录下Products文件夹有一个.a文件为红色,说明文件并不存在,需要接下来的处理就是将是自己写的库文件中所有的.m文件都放入.a文件中私有隐藏起来。

这里我们将系统生成的.h和.m文件删除。

3.选中TARGETS下的库文件名,创建对外暴露的头文件

创建完之后

4.将SDWebImage下的所有文件导入到SDWebImageStaticLib下

注意:第三步骤和第四步骤是可以调换的,只不过调换后需要手动的将需要暴露的头文件添加进去,所以不调换可以帮助我们完成。

此时默认的情况下,暴露的头文件都在Project下,应该移动到Public下

之前:

移动后:

5、然后点击左上角,选择Edit Scheme,Build Configuration下选择Release,先注意检查下面Release是否为NO:Yes表示只编译选中模拟器设备对应的架构,No则为编译所有模拟器设备支持的cup架构(Debug版本同理),选择NO,然后分别在模拟器和真机下Command+B编译一下,会看到Products文件夹下的.a文件变为黑色,这个.a文件就是我们想要得到的静态库,这里会出现一个问题你先编译的模拟器会发现.a依然是红色,你需要模拟器和真机都编译后.a才会变成黑色,这应该是Xcode本身的问题。

<1>

<2>

<3>

这3步设置完后,选择真机模式编译一下,Command + B,此时看到.a静态库文件变成了黑色。

然后将上面的第<3>步改为Debug,再选择模拟器编译一下,Command + B,就创建了模拟器环境下的.a文件,截图如下一样。

可以在终端看到,真机Release发布模式和模拟器Debug测试模式的.a文件都存在

文件为:

6、合并真机和模拟器.a文件,在终端输入以下命令行:lipo -create  模拟器.a文件的路径 真机.a文件的路径 -output 合并后的保存路径(最终会得到一个合并后的libSDWebImageStaticLib.a文件,再将暴露出来的.h头文件一起复制出来。

7、使用:只需将libSDWebImageStaticLib.a和暴露出来的.h头文件导入工程目录下就可供外界使用,这样就很好的保护了自己的实现源代码,不被他人篡改和偷窃。

8.这里再补充一下:

<1>.文件大小.a文件的体积(一般情况下)

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

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

<2>.

注:关于静态库对CPU架构的支持,首先了解iOS设备CPU架构方面的知识,ARM是微处理器行业的一家知名企业,arm处理器以体积小和高性能的优势在嵌入式设备中广泛使用,几乎所有手机都是使用它的。

模拟器:iphone4s~5 : i386 iphone5s~6plus : x86_64

真机:iphone3gs~4s : armv7  iphone5~5c : armv7s (静态库只要支持了armv7,就可以跑在armv7s的架构上) iphone5s~6plus : arm64

armv6, armv7, armv7s是ARM CPU的不同指令集,原则是向下兼容的。例如iPhone4S CPU支持armv7, 但它同时兼容armv6,只是使用armv6指令可能无法充分发挥它的特性。

查看静态库.a对处理器架构的支持,先cd到.a文件的路径下,命令行输入:lipo -info xxxxx.a

<3>.如果库中还包含了一些资源文件(如图片等),那么资源文件也应该放在上面的文件夹中。

9、制作静态库的注意点

(1)注意:

  无论是 .a 静态库还是 .framework 静态库,最终需要的都是:二进制文件 + .h + 其它资源文件

(2).a 和 .framework 的使用区别

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

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

(3)图片资源的处理

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

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

  建议:自己制作的静态库中要用到的图片资源,不建议直接以png的后缀名方式拖到项目中使用,而是推荐使用放到bundle文件中。这样可以避免静态库的图片名和使用静态库的项目中存在的图片产生冲突。

  1)新建一个文件夹,把需要打包的资源图片放在里面

例如:

    

  2)修改扩展名为 .bundle,敲回车,点击添加。

例如:

(4)多文件处理

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

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

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

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

(5).framework为什么既是静态库又是动态库

  系统的 .framework 是动态库

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

(6)静态库中包含了Category(分类)

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

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

时间: 2024-08-25 13:30:24

iOS:Xcode7创建静态库的相关文章

在iOS中创建静态库

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

详解Xcode7中创建静态库

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

Xcode7 中创建静态库

一.静态库和动态库的区别: 静态库和动态库是相对编译期和运行期的,静态库以 .a 和 .framework 形式存在,链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝:动态库以 .dylib 和 .framework 形式存在,链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存,一般只能由系统创建. 二.静态库简介: 1.静态库分为真机—Debug(调试)版本.真机—Release(发布)版本.模拟器—Debug版本.模拟器—R

iOS 创建静态库文件时去掉其中的Symbols

在工程中创建静态库文件时,默认会将一些Symbols加到静态库文件中,这样做有两个缺点: 1.如果引用静态库文件的工程中发生了bug,就会直接跳转到静态库的源码. 2.静态库文件的大小会因此翻几番.本人最近做的这个静态库文件中,去掉symbols前大小为7.8MB左右,去掉以后大小为2.8MB. 要去掉Symbols,首先打开Build Settings并选中静态库的Target,然后设置下列选项: 如果有错误或遗漏,欢迎批评指正. iOS 创建静态库文件时去掉其中的Symbols,布布扣,bu

ios开发中创建静态库的方法介绍

在进行iOS项目开发时,为了减少项目的编译时间,通常情况下会把项目中的私密内容打包成静态库,或者是把ios项目中变动较少一部分打包成静态库以便提高编译效率,很多iOS初学者对静态库与动态库的区别及创建使用,下面就一起来学习下: (一)iOS静态库.动态库与Framework静态库与动态库的区别: (1)什么是库? 库(Library)直白一点说就是一段编译好的二进制代码,加上头文件就可以供别人使用;(例如: iOS中Objective-C编译下的.h和.m文件,打包静态库后会变为.h和.a文件)

iOS创建静态库

刚刚学iOS,感觉iOS好高冷,今天学的是静态库. 1.在xcode中创建静态库,点击new project选择li b 2.创建之后会出现.h和.m文件我们可以在里面编写代码. 3.编译项目,分别生成针对模拟器和真机的.a文件(针对真机和模拟器分别运行一下). 4.合并静态库:  lipo -create 文件路径.

iOS练习-Xcode6创建静态库

开发中可能会有一些属于自己的类和工具函数,当这些代码被反复重用.重用代码的最简单方法是简单的 拷贝/粘贴 .然而,养以来在修复bug或者升级的时候就会遇到需要修改所有的拷贝.这时静态库便会拯救苦逼的我们. 一个静态库是若干个类,函数,定义和资源的包装 进行打包之后便可以在项目之间共享 以下简述摘自:http://www.it165.net/pro/html/201404/11585.html 程序编译一般需经预处理.编译.汇编和链接几个步骤.对于项目中的一些公共代码,如果想要对其进行复用,可以把

iOS 元件组件-创建静态库static library

概述 在项目开发的过程中,经常使用静态库文件.例如两个公司之间业务交流,不可能把源代码都发送给另一个公司,这时候将私密内容打包成静态库,别人只能调用接口,而不能知道其中实现的细节. 库是一些没有main函数的程序代码集合.除了静态库,还有动态链接库,他们之间的区别是:静态库可以编译到我们的执行代码中,应用程序可以在没有静态库的环境中运行:动态库不能编译到我们的执行代码中,应用程序必须在有链接库文件的环境下运行.另外,动态库在AppStore里,很有可能被拒绝,上架不了. 因而,一般情况下,我们都

iOS开发之静态库(五)—— 图片、界面xib等资源文件封装到静态框架framework

编译环境:Macbook Air + OS X 10.9.2 + XCode5.1 + iPhone5s(iOS7.0.3) 一.首先将资源文件打包成bundle 由于bundle是静态的,所以可以将“iOS开发之静态库(三)—— 图片.界面xib等资源文件封装到.a静态库”中生成的“MyToolsWithAssetsA.bundle”文件直接拿过来使用. 二.创建静态框架 创建过程参考“iOS开发之静态库(四)—— 静态框架framework制作”,里面介绍非常详细. 静态库代码借用“iOS开