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

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

静态库的拓展名是.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. poj2828 BuyTickets 线段树

    Buy Tickets Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 17326   Accepted: 8601 Desc ...

  2. 在QEMU中调试ARM程序【转】

    转自:http://linuxeden.com/html/develop/20100820/104409.html 最近我想调试一个运行在QEMU模拟ARM系统中的Linux程序.我碰到过一些麻烦,因 ...

  3. 以太坊MetaMask钱包插件简介

    MetaMask是一个以太坊钱包插件,虽然只能在Chrome浏览器中使用,但作为以太坊钱包的metamask却很受以太坊开发者欢迎. MetaMask 评价(5★):安装设置:★★★★界面操作:★★★ ...

  4. python中str常用操作

    1. 字符串的操作 字符串的连接操作 符号: + 格式:str1 + str2 例如:str1 = 'I Love' str2 = 'You!' print(str1 + str2) >> ...

  5. c语言程序第2次作业

    (一)改错题 1.输出带框文字:在屏幕上输出以下3行信息. 错误信息1:{{uploading-image-560144.png(uploading...)} 错误原因:stdio误写为stido 错 ...

  6. Socket.io应用之联网拖拽游戏

    服务器端代码: const express=require('express'); const http=require('http'); const sio=require('socket.io') ...

  7. 利用Express模拟web安全之---xss的攻与防

    一.什么是XSS? 跨站脚本攻击(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS.恶意 ...

  8. sea.js及三种加载方式的异同

      一.前言     浏览器本身并不提供模块管理的机制,过去网页开发中,为了使用各种模块,不得不在加入一大堆script标签.这样就使得网页体积臃肿,难以维护,还产生大量的HTTP请求,拖慢显示速度, ...

  9. 常用java开发文档链接

    使用java开源工具httpClient及jsoup抓取解析网页数据 : https://blog.csdn.net/lovoo/article/details/52674712 jsoup Cook ...

  10. Python中切片的工作原理

    切片时的索引是在两个字符之间.左边第一个字符的索引为 0,而长度为 n 的字符串其最后一个字符的右界索引为n. 例如: +---+---+---+---+---+---+ | P | y | t | ...