库是代码的集合,根据代码公开程度,分为开源库和闭源库。

其中闭源库主要包括静态库和动态库,是经过编译的二进制文件,看不到具体实现。

静态库的拓展名是.a或者.framework,动态库则是.dylib和.framework。

静态库在链接时会将库完整的复制到可执行文件中,被多次使用就有冗余拷贝。

动态库在链接时不复制,程序运行时系统会动态的加载,多个程序共享一个动态库,节省内存。

注意:项目中如果包含自制的动态库,上传到App Store会被拒绝,如果要上传App,应选择静态库。

静态库用于抽取核心代码来供给其他项目使用。

静态库的应用:MRC库(例如cocos2d-iphone)用于ARC项目,可以将MRC库打包成静态库。

下面以一个简单的例子来讲解创建静态库的过程。

这个例子实现一个类方法,用于获取一张图片。

①新建一个静态库项目:

②新建一个类,类中通过类方法实现读取一张图片。

需要注意的是,为了防止别人使用静态库时资源与库本身资源冲突,常把库的资源放到一个Bundle中,方法为新建文件夹,改名为拓展名为.bundle,右键显示包内容,放入资源即可,如下图创建了SGTool.bundle,放了一张用于获取的图片。

类的声明和实现如下,注意获取bundle中图片的方法:

//
// SGTool.h
// staticDemo
//
// Created by 11 on 8/2/15.
// Copyright (c) 2015 soulghost. All rights reserved.
// #import <Foundation/Foundation.h>
#import <UIKit/UIKit.h> @interface SGTool : NSObject + (UIImage*)getImage; @end
//
// SGTool.m
// staticDemo
//
// Created by 11 on 8/2/15.
// Copyright (c) 2015 soulghost. All rights reserved.
// #import "SGTool.h" @implementation SGTool + (UIImage *)getImage{ NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"button.png" ofType:nil inDirectory:@"SGTool.bundle"];
return [UIImage imageWithContentsOfFile:imagePath]; } @end

③点击工程配置的Build Phases,在Copy Files中加入打包时暴露的头文件,这些文件用于使用者调用方法和查看静态库内容,但.m不会暴露。

④在真机和模拟器下各编译一次工程,然后在Products文件夹下对.a文件点击右键选择Show in Finder,可以看到有用于真机和模拟器的静态库。

只需要导入其中的.a和include,然后把bundle也拖入工程,即可使用该静态库,一般把这三个文件打包命名为lib,如下图:

⑤因为真机和模拟器架构不同,真机一般是arm7、arm64,而模拟器是x86,因此静态库不同,为了能够制作二者都能使用的静态库,使用lipo命令合并静态库。

发布时请使用真机静态库。

lipo -create <file1.a> <file2.a> -output <mixfile.a>

lipo -create Debug-iphoneos/libstaticDemo.a Debug-iphonesimulator/libstaticDemo.a -output SGTool.a

此外,使用lipo -info <file.a>可以查看静态库支持的架构。

⑥区分Debug和Release的静态库:

默认是Debug,会有完整的符号信息方便调试,不会进行代码优化。

可更改为Release,会进行代码优化,不包含完整的符号信息,执行速度略有提高。

更改方法如下图所示:

(一〇二)静态库(.a)的打包的更多相关文章

  1. VC 静态库与动态库(二)静态库创建与使用

    1.新建项目,创建项目和解决方案 StaticLibrary  这是静态库项目 G:\C++Learn\Library  Library文件夹用于存放库相关文件,包含静态库与后面的动态库工程和解决方案 ...

  2. Android Studio 打包AAR和第三方静态库

    需求 现在有一个第三方库libstatic_add.a和对应的头文件static.h,要求封装一个Module,该Module依赖这个静态库,要求打包的Module包含该静态库. 方案 创建Andro ...

  3. iOS : 静态库制作

    一.静态库简介 1. 什么是库? 库 就是程序代码的集合, 是共享程序代码的一种方式 2. 库的分类? 开源库 公开源代码, 能看到具体实现 例如MJExtension, MJRefresh, AFN ...

  4. Windows下静态库与动态库的创建与使用

    Windows下静态库与动态库的创建与使用 学习内容:本博客介绍了Windows下使用Visual C++ 6.0制作与使用静态库与动态库的方法. --------CONTENTS-------- 一 ...

  5. iOS 静态库的制作

    按照公司的想法 要开发一款SDK,于是就抽空学习一下静态枯的制作过程. 在IOS中有静态库和动态库的区分,下面我们就来详细介绍一下. 一.静态库和动态库的详细介绍. 我们平时的工程中或多或少都要引入第 ...

  6. GCC 指令详解及动态库、静态库的使用

    GCC 指令详解及动态库.静态库的使用 一.GCC 1.1 GCC 介绍 GCC 是 Linux 下的编译工具集,是「GNU Compiler Collection」的缩写,包含 gcc.g++ 等编 ...

  7. iOS开发中静态库制作 之.a静态库制作及使用篇

    iOS开发中静态库之".a静态库"的制作及使用篇 一.库的简介 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的类型? 根据源代码的公开情况,库可以分为2种类 ...

  8. QT中静态库的生成与使用

    一. 静态库的生成    1. 测试目录: lib    2. 源码文件名: mywindow.h, mywindow.cpp, 类MyWindow继承于QPushButton, 并将文字设置为&qu ...

  9. QT中静态库的生成与使用——创建共享库代码,附例子

    一. 静态库的生成    1. 测试目录: lib    2. 源码文件名: mywindow.h, mywindow.cpp, 类MyWindow继承于QPushButton, 并将文字设置为&qu ...

随机推荐

  1. [NOI2011]

    来自FallDream的博客,未经允许,请勿转载,谢谢. 省选完挂.但是善良的教练今天丢了一套NOI2011给我们训练 6道题233(虽然一道题做过了,一道题普及组的都会,就算是4道吧) 熬了一天,总 ...

  2. (MariaDB/MySQL)之DML(2):数据更新、删除

    本文目录:1.update语句2.delete语句 2.1 单表删除 2.2 多表删除3.truncate table 1.update语句 update用于修改表中记录. # 单表更新语法: UPD ...

  3. VC++6.0的使用方法

    VC++6.0的最基本使用方法,创建一个c++项目工程可参考:https://jingyan.baidu.com/article/8ebacdf0cbdb5749f75cd54a.html 这里面的操 ...

  4. Linux下如何进入中文目录

    给Linux安装图形用户界面之后,会在工作目录中生成图片, 文档, 下载........等中文目录,以前不知道如何进入这些目录,感觉也没有必要,今天在火狐上下载了一个软件,默认在下载这个目录当中,实在 ...

  5. C#中Fun简单介绍及运用到项目中与缓存(本地缓存,Redis)结合使用

     1.简单介绍Fun C#中Fun和Action有点类似,都是一个委托方法,不同的是Func是有返回值的,而Action没有. (T)此委托封装的方法的参数类型. 备注:详情了解Fun到(https: ...

  6. localeCompare() 方法实现中文的拼音排序

    google了很多次才发现在国外网站上有提示如何比较中文,原文地址:http://www.webdeveloper.com/forum/showthread.php?t=9365 前提:使用Unico ...

  7. linux上安装fastdfs+nginx+ngin-module实践并解决多个异常篇

    为什么选择Nginx Nginx 是一个很牛的高性能Web和反向代理服务器, 它具有有很多非常优越的特性: 在高连接并发的情况下,Nginx是Apache服务器不错的替代品:Nginx在美国是做虚拟主 ...

  8. setuptools安装和错误解决

    错误解决:ImportError No module named setuptools GitHub: https://github.com/pypa/setuptools 下载安装 wget htt ...

  9. kafka topic 相关操作

    1.列出集群中的topic bin/kafka-topics.sh --zookeeper spark1:2181,spark2:2181,spark3:2181 --list 2.创建topic r ...

  10. java中的final和volatile详解

    相比synchronized,final和volatile也是经常使用的关键字,下面聊一聊这两个关键字的使用和实现 1.使用 final使用: 修饰类表示该类为终态类,无法被继承 修饰方法表示该方法无 ...