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

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

静态库的拓展名是.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. JSP 基本语法

    1 JSP 的由来 servlet产生后,存在很大的问题,为了表现页面的效果,需要输出大量的HTML 语句,表现为一个个字符串,不仅利于开发,也不利于后期的维护,由此产生了JSP.主要用于将Servl ...

  2. Git与Github的基本概念

    git git是一个分布式版本控制系统,在这里就要介绍一下什么是版本控制:参考至维基百科 版本控制(Revision control)是维护工程蓝图的标准作法,能追踪工程蓝图从诞生一直到定案的过程.此 ...

  3. Linux下用程序实现统计cpu和内存的利用率

    Linux下没有直接可以调用系统函数知道CPU占用和内存占用.那么如何知道CPU和内存信息呢.只有通过proc伪文件系统来实现. proc伪文件就不介绍了,只说其中4个文件.一个是/proc/stat ...

  4. 触发事件trigger

    触发事件,在本例中,文档加载好之后,就触发dblclick双击事件,而不是通过去手动双击. <script src="http://how2j.cn/study/jquery.min. ...

  5. expect IDENTIFIER, actual IDENTIFIER 处理

    涉及到注入数据库的报错,这是很常见的了. 但是期望IDENTIFIER,实际IDENTIFIER 的报错,你们知道是什么意思吗? 我已开始看到的时候,是mybatis报错发神经了,报错了报错.再跑一次 ...

  6. 利用mybatis-generator自动生成数据持久化的代码

    MyBatis生成器简介 MyBatis Generator(MBG)是MyBatis MyBatis 和iBATIS的代码生成器.它将生成所有版本的MyBatis的代码,以及版本2.2.0之后的iB ...

  7. WPF ListBox 获取listBoxItem

    1.已知item的DataContext,获取ListBoxItem 1)ItemContainerGenerator.ContainerFromItem var selectedItem = Doc ...

  8. CentOS 7 配置网络连接

    在VMware workstation12上新建虚拟机,发现无法连接网络.然后查了一些资料,知道了怎样配置网络,记录一下. 1.首先用ifconfig命令查看虚拟机的IP地址及网关信息 观察显示内容, ...

  9. url重定向或者重写

    有四种方式:1.urlMappings,返回200状态码 <system.web> <urlMappings > <add url="~/others.aspx ...

  10. Python中的转义

    在Python交互式解释器中,输出的字符串会用引号引起来,特殊字符会用反斜杠(\)转义.如果遇到带有\的字符被当作特殊字符时,有以下两种处理方法:1.使用双反斜杠(\\)来转义2.使用原始字符串,方法 ...