iOS开发中静态库与各个构架详细分析

本文详细介绍iOS中静态库及Framework的创建过程,包括不同架构的编译、资源文件的添加、边开发边调试的技巧以及静态库合成方法。同时探讨了在不同设备上运行时可能出现的架构不匹配问题及其解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.首先要先学会创建一个静态库;

点这个即可创建出如下的target



然后在.h中定义方法,在.m中实现对应方法,我拿这个简单的方法做操作



关键的点来了,此时需要先在虚拟机状态下编译(没sb什么的,所以不会有显示).然后再在真机情况下编译一次(千万不能够插着手机编译,接下来会解释).这时候对应得.a文件就会由红变黑,此时文件真实存在,show in finder 如下


此时会生成对应的调试状态下的真机和虚拟机的.a静态库.

这时把对应的库导入想要用到的项目中去:


导入的是虚拟机状态下的静态库;一开始创建时是在6sPlus的情况下编译的.这时候我们在4s上运行,就会报错如下:


这时候我们引出了架构的问题:

常见问题: //architecture: 架构    not found for architecture x86_64

A: 模拟器和真机的架构

 //模拟器编译时只输出一种架构

 //真机(不要插入iPhone),默认输出多种架构, 除了armv7s (这就是之前没让插入真机的原因)

 //201410月的某个版本更新中, 取消了armv7s为默认输出选项

 //架构是支持低版本兼容

 

B: 如何查看架构 

 cd到静态库目录下

 查看架构: lipo -info lib.a

C: 模拟器:2种架构

 i386 : 4S ~ 5    -->  32

 x86_64  : 5S ~ 6s   -->  64

 

  真机: 3种架构

  armv7   :4 ~ 4s

  armv7s  : 5 ~ 5c

  arm64   : 5S ~ 6s

显然运行在4s上的时候因为架构不对.缺少i386架构.这时候只要简单方法即可解决如下:

更改编译参数

 点击库文件 --> Target --> Build Setting --> 只编译当前架构选项改为NO

 如果是模拟器编译, 则直接编译成2个版本之和

 如果是真机编译,仍然编译成2个版本之和




改为NO即可.再重新编译一下静态库.这时候的架构就是:


真机的话自动就是NO,所以就会自动生成2种架构.但是没有armv7s这种框架.需要我们手动添加如下:


架构情况:


我在弄这个的时候顺带着就把发布状态的静态库也编译好了,方法如下:





所以在静态库这出问题的话就只有:虚拟机状态下添加了真机状态下的静态库(反之同理),只编译得到了对应手机型号的架构,然后运行在别的手机型号上.




剩下的就是静态库的合成了,我相信大家都会的,在这里我就也简答描述一下:

合成静态库通用文件的优缺点

 如果不合成: 比如百度2.8.1版本 优点:减少文件体积  缺点: 真机和模拟器切换调试非常不方便

 如何合成:   比如友盟         优点: 调试方便    缺点: 体积大


方法如下:先cd到对应的路径(Products)下,

lipo -create /Users/fang/Library/Developer/Xcode/DerivedData/Text-hlfcmwksqcqkdufmlgqvdxumjvjm/Build/Products/Debug-iphonesimulator/libText.a /Users/fang/Library/Developer/Xcode/DerivedData/Text-hlfcmwksqcqkdufmlgqvdxumjvjm/Build/Products/Debug-iphoneos/libText.a -output libDebugAll.a


得到:


此时的架构种类:


.a静态库已分析完.还有一些补充:eg: A:边开发边调试.a静态库.B:创建Framework静态库

#pragma mark 1. 添加资源文件

一定要方法到bundle文件夹下, 保证路径加载是唯一的资源. 否则可能会跟项目里的同名文件发生冲突, 导致文件加载出错.


#pragma mark 2. 边开发边调试.a静态库

1. 创建普通的项目

2. 添加项目Target, 创建库文件, 并实现相关方法

3. 在项目中手动导入.a文件  (重要)

4. 此时.a是通用文件, 什么架构都可以使用.

5. 如果想导出静态库文件, 那么切换Target, 按照之前所学输出即可.


#pragma mark 3. 创建Framework静态库

1. 头文件跟.a一样, 默认只输出创建项目时自带的.h

2. 如果要导出头文件, 找项目--> Build Phases --> Headers --> Project的头文件拖拽到Public中即可

3. 其他的架构编译方式跟.a一样


4. Framework的形式 默认导出是动态库 (.dylib / Xcode7 .tbd) . 找到项目--> Embedded Binaries 添加Framework即可.

5. 动态库不能上架, 需要转换静态库 : --> Build Setting --> 搜索mach --> 修改成静态库即可


#pragma mark 4. 测试Framework静态库

1. 一定要注意头文件的导出 . 头文件如果敲不出来, 强制敲

2. 如果需要导出, 参考上面的导出方式即可(注意转换动态库)



学习的怎么样?????不明白的可以继续交流;这是本人第一次写博客,可能在表达上有些欠缺.忘理解.......

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值