【iOS】编译静态库
与java和.net一样,objc也由类库的概念,不过在在objc上一般叫库,库表示程序代码集合,可以共享给其他程序使用,库是编译后的二进制文件,因此不能看到源代码,多用于一些开放sdk(如百度地图sdk),商用库,这两天在研究iOS上编译静态库,这里把编译的过程和中间遇到的一些问题做一下记录,方便以后查阅
objc上的库一般分为两类
静态库: .a 和 .framework
.a文件:纯二进制文件,需要配合.h文件一起使用,通过.h文件引用库里面的内容
.framework文件:包含二进制文件
链接时,静态库会被完整地复制到可执行文件中,例如iOS程序打包的时候会包含所有引用的静态库
动态库: .dylib 和 .framework
iOS项目不支持动态库,每个APP都是独立运行的,并且不能直接互相访问,APP只能访问系统自带的动态库,动态库系统只加载一次,并可以用于多个程序共享的,一般在用于桌面系统,链接时不会被添加到可执行文件,如果动态链接库不存在,程序可能执行失败
这里只讨论静态链接库,这里只讨论.a文件的生成,.framework文件先不讨论
1、下面我们创建一个自己的静态库(Cocoa Touch Static Library)

2、添加自己的类和category
编译的时候需要将 头文件拷贝到生成的库路径下,这里的头文件是用于给外部使用的,一般是把库里面的文件放在一个头文件中引用,这样外部在使用的时候直接引用该头文件即可

3、设置支持的最低版本和最高版本
Base SDK:是当前类库是基于哪个版本的SDK开发的,也就是最高支持的SDK
Deployment Target:类库支持的最低版本


4、配置编译选项
由于我们编译的是类库,在使用的时候需要支持Debug和Release两种模式下,需要编译所有的architecture版本

4、编译(Cmd + B)
我们分别切换到模拟器和真机模式进行编译,在真机模式下编译完成后,Products中的文件会变正常(原来为红色)
注意,需要设置Build Release 版本


5、编译完成
编译完成后我们得到很多个.a文件,每个目录下都对应一个.a文件,从libCalculator.a进入Finder查看
iphoneos是真机用的
iphonesimulator是给模拟器用的

6、使用
我们创建一个iOS项目,吧相关的.a文件和.h文件拖到我们的项目中,拖入后,xcode会自动把静态库添加到工程

这里需要注意的是
1、头文件也要引入到工程里面(不然你怎么用)
2、模拟器和真机对应的.a文件不一样,根据需要引用.a文件
2、如果静态库内有category分类,那么需要在添加 -ObjC 编译标识,否则可能会报:unrecognized selector sent to instance

3、其他编译参数
-ObjC:加了这个参数后,链接器就会把静态库中所有的Objective-C类和分类都加载到最后的可执行文件中
-all_load:会让链接器把所有找到的目标文件都加载到可执行文件中,但是千万不要随便使用这个参数!假如你使用了不止一个静态库文件,然后又使用了这个参数,那么你很有可能会遇到ld: duplicate symbol错误,因为不同的库文件里面可能会有相同的目标文件,所以建议在遇到-ObjC失效的情况下使用-force_load参数。
-force_load:所做的事情跟-all_load其实是一样的,但是-force_load需要指定要进行全部加载的库文件的路径,这样的话,你就只是完全加载了一个库文件,不影响其余库文件的按需加载
引用自:http://www.cnblogs.com/robinkey/archive/2013/05/27/3101095.html
4、如果静态库中采用ObjectC++实现,或者静态库使用C/C++写的,在调用的时候可能出错,因此需要您保证您工程中至少有一个.mm后缀的源文件(您可以将任意一个.m后缀的文件改名为.mm)
或者在工程属性中指定编译方式,即将XCode的Project -> Edit Active Target -> Build -> GCC4.2 - Language -> Compile Sources As设置为"Objective-C++"
引用自:http://blog.csdn.net/zhangkongzhongyun/article/details/8047500
7、合并.a文件
上面看到,编译后的用于模拟器的静态库和用于真机的静态库不一样,每次切换的适合都得重新引用.a文件,这样显得特别麻烦,苹果提供了一个合并多个.a文件的方法,合并后的.a文件真机和模拟器都支持(合并后大小为原来两个文件大小之和)
在终端通过命令合并
lipo –create Release-iphoneos/libsqlcipher.a Release-iphonesimulator/libsqlcipher.a –output libsqlcipher.a
还有一种方法可以动态的引用静态库,就是通过配置工程的库引用路径和编译标示,编译的适合xcode会根据当前的环境自动找到相关的.a库,参见:http://www.cnblogs.com/bomo/p/4760791.html
8、Demo
http://files.cnblogs.com/files/bomo/CompileStaticLibrary.zip
【iOS】编译静态库的更多相关文章
- 手淘架构组最新实践 | iOS基于静态库插桩的⼆进制重排启动优化 抖音研发实践:基于二进制文件重排的解决方案 APP启动速度提升超15% 编译期插桩
抖音研发实践:基于二进制文件重排的解决方案 APP启动速度提升超15% 原创 Leo 字节跳动技术团队 2019-08-09 https://mp.weixin.qq.com/s/Drmmx5JtjG ...
- iOS生成静态库方法
在iOS的开发过程中,我们常常用到第三方的库.比如支付.地图.广告等. 那么,如何制作自己的库文件呢? 如何将自己写的功能类编译成库文件,分发给其他人来使用呢并做成通用库里? iOS开发一年多来没有制 ...
- xcode6制作IOS .a静态库小记
xcode6制作IOS .a静态库小记 创建iOS静态库 简单写个打印的代码 编码完成之后,直接Run就能成功生成.a文件了,选择 xCode->Window->Organizer-> ...
- iOS中静态库-.a文件生成和使用
最近在使用使用一个网上的Demo的时候. 出现另一令人烦恼的问题 . 就是它里面有嵌套的工程. 如下图所示. 工程里面还嵌套有一个工程. 真的是让人煞费苦心 …其实这个问题看起来并不是很难, 如果是一 ...
- iOS基础 - 静态库
一.什么是库? 库是共享程序代码的方式,一般分为静态库和动态库. 二.静态库与动态库的区别? 静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝. 动态库:链接时不复制,程序运行时由系 ...
- 关于使用Visual编译静态库动态库及其使用的问题
本文主要讲述了如何使用Visual Studio 2013 编译静态库和动态库,并使用. 一.静态库 1. 编写静态库 若要创建将引用并使用刚创建的静态库的应用程序,请从“文件”菜单中选择“新建”, ...
- android ndk-build 编译静态库libxx.a 以及Android studio openssl 静态库配置(cmake)
android ndk-build 编译静态库libxx.a 需求场景: 目前有安卓编码好的现在的openssl的两个.a,我们需要调用openssl的函数,并把功能再封装成.a; 这样使用时,在an ...
- 【转】TI DSP C6657学习之——编译静态库.lib
熟悉C++开发的的小伙伴都知道,我们一般代码中往往要引入许多第三方编译好的库,有些是静态链接库static library, 有些是动态链接库dll.引入库的目的一是减少代码的编译时间,二是只提供函数 ...
- Makefile 编译静态库文件及链接静态库
本文为原创文章,转载需指明该文链接 1.代码目录结构如下: comm/ comm/inc/apue.h 3 atexit.c Makefile 5 staticlib/lib/ staticlib ...
随机推荐
- 将w3cplus网站中的文章页面提取并导出为pdf文档
最近在看一些关于CSS3方面的知识,主要是平时看到网页中有很多用CSS3实现的很炫的效果,所以就打算系统的学习一下.在网上找到很多的文章,但都没有一个好的整理性,比较凌乱.昨天看到w3cplus网站中 ...
- 解决Windows Server2008 R2中IE开网页时弹出阻止框(Windows Server2008网页无法打开的问题)
相信使用Windows Server2008的朋友都遇到过这种情况,用IE打开网站时会弹出“Internet Explorer增强安全配置正在阻止来自下列网站的此应用程序中的内容”的对话框.如下图所示 ...
- 频域分辨率与DFT,DCT,MDCT理解
搞了这么久音频算法,有些细节还没有很清楚. 比如DFT和DCT有哪些区别,DFT系数为什么会是对称的,同样帧长的数据,各自的频域分辨率是多少? 今天决定搞清楚这些问题, 首先DFT的系数对称(2N点的 ...
- android实现自动升级并安装打开
http://blog.csdn.net/wa991830558/article/details/41014673 这是一个比较简单的程序,但网上还是有很多人问起这个问题,并且回答的人,也没有完全回答 ...
- 处理XML
虽然被JSON抢了风头,但XML仍旧非常重要.看得见的,看不见的,XML在很广泛的领域对我们发挥着影响. 修改XML文件,是我经常遇到的事情.方式从手动在Visual Studio或者Notepad+ ...
- node-webkit 笔记
NW.js is an app runtime based on Chromium and node.js. You can write native apps in HTML and JavaScr ...
- CLR VIA
标题 状态 内容 什么是CLR? 什么是托管模块? 托管模块由什么组成? .net代码的执行过程 http://www.cnblogs.com/aaa6818162/p/4726581.ht ...
- MassTransit_契约的创建
消息契约的命名规范 命令模式:动词+对象 事件模式:对象+动词 不同模式下要求不同的主键 Creating a message contract In MassTransit, a message c ...
- T-SQL 公用表表达式(CTE)
公用表表达式(CTE) 在编写T-SQL代码时,往往需要临时存储某些结果集.前面我们已经广泛使用和介绍了两种临时存储结果集的方法:临时表和表变量.除此之外,还可以使用公用表表达式的方法.公用表表达式( ...
- Spark源码系列(一)spark-submit提交作业过程
前言 折腾了很久,终于开始学习Spark的源码了,第一篇我打算讲一下Spark作业的提交过程. 这个是Spark的App运行图,它通过一个Driver来和集群通信,集群负责作业的分配.今天我要讲的是如 ...