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

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

  1. 我可把嵌套工程里面的文件拖拽出来. 修改一些属性什么的应该可以使用了
  2. 还有一种方法就是我把嵌套里面的工程整个生成一个静态库文件.把我需要使用的文件的.h暴露出来使用.
    但是这个工程比较奇葩. 他里面是c++de一些文件. 如果直接拖拽的话会有各种引用文件错误的问题. 没办法现在只能使用第二种方法. 生成.a的文件了. 虽说现在还在努力中,但是至少能看见些希望了吧!

iOS 静态库,动态库与 Framework

静态库与动态库的区别

首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用。

什么时候我们会用到库呢?一种情况是某些代码需要给别人使用,但是我们不希望别人看到源码,就需要以库的形式进行封装,只暴露出头文件。另外一种情况是,对于某些不会进行大的改动的代码,我们想减少编译的时间,就可以把它打包成库,因为库是已经编译好的二进制了,编译的时候只需要 Link 一下,不会浪费编译时间。

上面提到库在使用的时候需要 Link,Link 的方式有两种,静态和动态,于是便产生了静态库和动态库。

静态库

静态库即静态链接库(Windows 下的 .lib,Linux 和 Mac 下的 .a)。之所以叫做静态,是因为静态库在编译的时候会被直接拷贝一份,复制到目标程序里,这段代码在目标程序里就不会再改变了。

静态库的好处很明显,编译完成之后,库文件实际上就没有作用了。目标程序没有外部依赖,直接就可以运行。当然其缺点也很明显,就是会使用目标程序的体积增大。

动态库

动态库即动态链接库(Windows 下的 .dll,Linux 下的 .so,Mac 下的 .dylib)。与静态库相反,动态库在编译时并不会被拷贝到目标程序中,目标程序中只会存储指向动态库的引用。等到程序运行时,动态库才会被真正加载进来。

动态库的优点是,不需要拷贝到目标程序中,不会影响目标程序的体积,而且同一份库可以被多个程序使用(因为这个原因,动态库也被称作共享库)。同时,编译时才载入的特性,也可以让我们随时对库进行替换,而不需要重新编译代码。动态库带来的问题主要是,动态载入会带来一部分性能损失,使用动态库也会使得程序依赖于外部环境。如果环境缺少动态库或者库的版本不正确,就会导致程序无法运行(Linux 下喜闻乐见的 lib not found 错误)。

iOS Framework

除了上面提到的 .a 和 .dylib 之外,Mac OS/iOS 平台还可以使用 Framework。Framework 实际上是一种打包方式,将库的二进制文件,头文件和有关的资源文件打包到一起,方便管理和分发。

在 iOS 8 之前,iOS 平台不支持使用动态 Framework,开发者可以使用的 Framework 只有苹果自家的 UIKit.Framework,Foundation.Framework 等。这种限制可能是出于安全的考虑。换一个角度讲,因为 iOS 应用都是运行在沙盒当中,不同的程序之间不能共享代码,同时动态下载代码又是被苹果明令禁止的,没办法发挥出动态库的优势,实际上动态库也就没有存在的必要了。

由于上面提到的限制,开发者想要在 iOS 平台共享代码,唯一的选择就是打包成静态库 .a 文件,同时附上头文件(例如微信的SDK)。但是这样的打包方式不够方便,使用时也比较麻烦,大家还是希望共享代码都能能像 Framework 一样,直接扔到工程里就可以用。于是人们想出了各种奇技淫巧去让 Xcode Build 出 iOS 可以使用的 Framework,具体做法参考这里和这里,这种方法产生的 Framework 还有 “伪”(Fake) Framework 和 “真“(Real) Framework 的区别。

iOS 8/Xcode 6 推出之后,iOS 平台添加了动态库的支持,同时 Xcode 6 也原生自带了 Framework 支持(动态和静态都可以),上面提到的的奇技淫巧也就没有必要了(新的做法参考这里)。为什么 iOS 8 要添加动态库的支持?唯一的理由大概就是 Extension 的出现。Extension 和 App 是两个分开的可执行文件,同时需要共享代码,这种情况下动态库的支持就是必不可少的了。但是这种动态 Framework 和系统的 UIKit.Framework 还是有很大区别。系统的 Framework 不需要拷贝到目标程序中,我们自己做出来的 Framework 哪怕是动态的,最后也还是要拷贝到 App 中(App 和 Extension 的 Bundle 是共享的),因此苹果又把这种 Framework 称为 Embedded Framework。

Swift 支持

跟着 iOS8 / Xcode 6 同时发布的还有 Swift。如果要在项目中使用外部的代码,可选的方式只有两种,一种是把代码拷贝到工程中,另一种是用动态 Framework。使用静态库是不支持的。

造成这个问题的原因主要是 Swift 的 Runtime 没有被包含在 iOS 系统中,而是会打包进 App 中(这也是造成 Swift App 体积大的原因),静态库会导致最终的目标程序中包含重复的 Runtime(这是苹果自家的解释)。同时拷贝 Runtime 这种做法也会导致在纯 ObjC 的项目中使用 Swift 库出现问题。苹果声称等到 Swift 的 Runtime 稳定之后会被加入到系统当中,到时候这个限制就会被去除了。

CocoaPods 的做法

在纯 ObjC 的项目中,CocoaPods 使用编译静态库 .a 方法将代码集成到项目中。在 Pods 项目中的每个 target 都对应这一个 Pod 的静态库。不过在编译过程中并不会真的产出 .a 文件。如果需要 .a 文件的话,可以参考这里,或者使用 CocoasPods-Packager 这个插件。

当不想发布代码的时候,也可以使用 Framework 发布 Pod,CocoaPods 提供了 vendored_framework 选项来使用第三方 Framework,具体的做法可以参考这里这里

对于 Swift 项目,CocoaPods 提供了动态 Framework 的支持,通过 use_frameworks! 选项控制。

更多有关代码分发的扩展资料可以参考这篇博客: http://geeklu.com/2014/02/objc-lib/

上文转自:https://skyline75489.github.io/post/2015-8-14_ios_static_dynamic_framework_learning.html

静态库怎么生成呢?

简介

在企业开发中,一些核心技术或者常用框架,出于安全性和稳定性的考虑,不想被外界知道,所以会把核心代码打包成静态库,只暴露头文件给程序员使用(比如:友盟、百度地图等第三方的sdk)

  • 库的分类-根据源代码的公开情况,库可以分为2种类型
  1. 开源库 – 公开源代码,能看到具体实现
    比如SDWebImage、AFNetworking
  2. 闭源库 – 不公开源代码,是经过编译后的二进制文件,看不到具体实
       主要分为:静态库、动态库
  • 静态库和动态库的区别
    静态库:链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝


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

注意:项目中如果使用了动态库,会苹果拒接 – 待验证

静态库文件的版本(4种)

  • 真机-Debug版本
  • 真机-Release版本
  • 模拟器-Debug版本
  • 模拟器-Release版本

Debug(调试)版本

1.含完整的符号信息,以方便调试
2.不会对代码进行优化

Release(发布)版本

1.不会包含完整的符号信息
2.的执行代码是进行过优化的
3.的大小会比Debug版本的略小
4.在执行速度方面,Release版本会更快些(但不意味着会有显著的提升)

所以我们一般开发中都打包Release(发布)版本,提供外界

设备的CPU架构简介

模拟器:

4s~5 : i386
5s~6plus : x86_64

真机:

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

制作静态库 - Debug版
1.新建项目
2.添加静态库并命名

3.需要打包到进静态库的代码,放在这个文件夹内

4.重新创建测试类(HSCalculate),提供外界计算两个数和的方法

HSCalculate.h

123
@interface HSCalculate : NSObject+ (NSInteger)sumNum1:(NSInteger)num1 num2:(NSInteger)num2;@end

HSCalculate.m

12345678910
#import "HSCalculate.h"

@implementation HSCalculate

+ (NSInteger)sumWithNum1:(NSInteger)num1 num2:(NSInteger)num2{return num1 + num2;}

@end

5.需要暴露给外界的文件(接口)

6.打包支持模拟器和真机的静态库(分别选择真机和模拟器运行,就会生成对应的静态库)

7.查看打包好的静态库

两个文件夹,里面的.a文件就是打包好的静态库

Debug-iphoneos : 真机
Debug-iphonesimulator:模拟器

可用下面命令查看静态库支持的cpu架构(可查看上面描述的cpu架构类型)

1
lipo -info xxx.a

分别查看打包好的模拟器与真机的静态库所支持的cpu架构

你会发现模拟器的静态库少了4s~5 : i386架构

原因:

下面Debug:Yes表示只编译选中模拟器对应的架构,No则为编译所有模拟器支持的cup架构(Debug的Yes状态改为No即可)

修改完后,重新编译:

8.在本项目对该静态库进行调试,ViewController.m导入HSCalculate.h,测试运行,你会发现报错了

1234567891011121314151617
#import "ViewController.h"#import "HSCalculate.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {[super viewDidLoad];

NSInteger result = [HSCalculate sumWithNum1:23 num2:25];NSLog(@"result: %d", result);}

@end

报错:

原因:

需要导入静态库(编译即可运行成功)

9.同时支持真机与模拟器的静态库(需要合并)

真机和模拟器的静态库,是不一样的,不能同时适用在真机和模拟器上,但要满足这要求的话,要对编译好的两个静态库进行合并

合并好坏:

好:开发过程中既可以在真机上调试,也可以在模拟器上调试
坏:如果静态库太大,合并打包后,会非常大,因此很多第三方的静态库的.a是区分版本的

合并产生新的静态库:

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

10.把合并好的静态库和外界访问的文件拉入到新工程,即可使用(inc文件自己建立的)

新建工程测试:

制作静态库 - Release版

跟Debug版步骤一样,只不过在编译时,改下面的选项即可

大概步骤差不多就这些. 其实看起来还不是很麻烦的嘛 OK 祝你好远喽… 以后肯定会用到的. 恩恩. mark—-先

参考:
部分转载与 – iOS 静态库开发
iOS开发拓展篇—静态库

http://rookie.org.cn/2015/12/24/StaticLibary/

时间: 2024-10-16 16:17:59

iOS中静态库-.a文件生成和使用的相关文章

ios中静态库的创建和使用、制作通用静态库(Cocoa Touch Static Library)

创建静态库可能出于以下几个理由: 1.你想将工具类代码或者第三方插件快捷的分享给其他人而无需拷贝大量文件.2.你想让一些通用代码处于自己的掌控之下,以便于修复和升级.3.你想将库共享给其他人,但不想让他们看到你的源代码. Xcode6创建静态库详解(Cocoa Touch Static Library) 一.创建静态库文件 打开Xcode, 选择File ----> New ---> Project. 新建工程. 选择iOS ----> Framework & Library -

iOS 打包静态库.a文件(真机版 + 虚拟机)

我们以打包IOS开发中封装的高地地图基础功能包 GDMap为例. 1>我们需要准备好需要打包的GDMap 2>接下来我们开始新建一个工程文件取名GDMap 3>删掉无用自动生成的.h 和.m 文件,把准备好的GDMap拖入工程中,注意文件放在一级目录下. 4>接下来我们选择出来需要暴露出来的头文件.h 我选择暴露出所有的头文件如下图 5>接下来我们配置下工程文件,修改 Product->Scheme-> Edit Scheme下 为 Release 6>配置

iOS中静态库的制作——使用创建静态库项目的方式创建静态库

最近公司要求写SDK,我就想把它弄成静态库的方式 我的理解:所谓静态库,就是把所有的.m文件打包成一个.a文件,这样使分享代码的时候更加简洁,重要的是别人也不会看到你.m文件中的傻B代码了 环境是Xcode6.2 iOS8.2 首先,创建一个静态库项目 删掉Xcode自动创建的同名文件,然后导入你需要做成静态库的文件 在这里我导入一个简单的输出字符串的文件 然后选择运行的设备进行编译,这里我有不理解的地方:在Xcode6.2中,当我首先选择模拟器,然后编译文件的时候,.a文件依然是红色的,说明静

【转】IOS静态库a文件制作流程

原文网址:http://www.jianshu.com/p/3439598ea61f 1.新建Cocoa Touch Static Library工程 新建工程 2.Xcode的参数设置 "Build Active Architecture Only" 设置为"NO" "IOS Deployment Target" 设置为 "IOS 7.0" ,表示支持IOS7.0以上系统版本的编译 Build Active Architec

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

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

iOS静态库.a文件制作和导入使用

iOS静态库.a文件制作: 1.新建Cocoa Touch Static Library工程 新建工程 - 选择iOS-FrameWork&Libary,选择 Cocoa Touch Static Library工程. 2.Xcode的参数设置 "Build Active Architecture Only" 设置为"NO" "IOS Deployment Target" 设置为 "IOS 7.0" ,表示支持IOS7

iOS如何查看静态库.a文件支持的cpu类型

打开终端: 输入 lipo -info 然后将你要查看的静态库.a 文件找到,拖入 -info 后边.假设路径为A,即为 lipo -info A 回车键,然后就会看到静态库是否支持 armv7,armv7s,arm64,i386,x86_64 这些. 原文地址:https://www.cnblogs.com/Free-Thinker/p/8358118.html

zt:我使用过的Linux命令之ar - 创建静态库.a文件

我使用过的Linux命令之ar - 创建静态库.a文件 本文链接:http://codingstandards.iteye.com/blog/1142358    (转载请注明出处) 用途说明 创建静态库.a文件.用C/C++开发程序时经常用到,但我很少单独在命令行中使用ar命令,一般写在makefile中,有时也会在shell脚 本中用到.关于Linux下的库文件.静态库.动态库以及怎样创建和使用等相关知识,参见本文后面的相关资料[3]<关于Linux静态库和动态库的分析>. 常用参数 格式

【转载】我使用过的Linux命令之ar - 创建静态库.a文件

本文链接:http://codingstandards.iteye.com/blog/1142358 (转载请注明出处) 用途说明创建静态库.a文件.用C/C++开发程序时经常用到,但我很少单独在命令行中使用ar命令,一般写在makefile中,有时也会在shell脚 本中用到.关于Linux下的库文件.静态库.动态库以及怎样创建和使用等相关知识,参见本文后面的相关资料[3]<关于Linux静态库和动态库的分析>. 常用参数格式:ar rcs libxxx.a xx1.o xx2.o参数r:在