(一〇二)静态库(.a)的打包

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

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

静态库的拓展名是.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,会进行代码优化,不包含完整的符号信息,执行速度略有提高。

更改方法如下图所示:

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-14 04:04:00

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

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

1.新建项目,创建项目和解决方案 StaticLibrary  这是静态库项目 G:\C++Learn\Library  Library文件夹用于存放库相关文件,包含静态库与后面的动态库工程和解决方案 StaticLibraryDemo  静态库解决方案名称 2.点击下一步,出现如下界面 选择静态库,选择预编译头,如果需要使用MFC就勾选上,最后点击完成 3.然后VS左边解决方案管理器会显示相关文件 这就是个最简单的静态库,编译生成下 4.文件夹生成了相关文件 解决方案目录: 解决方案目录下,项

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

需求 现在有一个第三方库libstatic_add.a和对应的头文件static.h,要求封装一个Module,该Module依赖这个静态库,要求打包的Module包含该静态库. 方案 创建Android Studio Library  Project 创建Project时,记得添加"Include C++ Support",如果没有安装CMake,LLDB和NDK的话,记得安装一下. 项目创建好后,包括以下目录和文件(部分目录或文件是后面添加的): build.gradle配置 针对

iOS 静态库制作及使用问题

参考:http://blog.163.com/const_yixinyiyi/blog/static/180088172201211113333882/ 静态库使用目标:(.a ) > 自己制作一个静态库(可以使用)(前三步) > 制作模拟器版本和真机版本 (第四步) > 合并两个版本 (第六步) 创建静态库步骤: 1. 选择要创建的文件类型:Cocoa Touch Static Library (.a文件) 2.将需要封装的文件导入其中 选择工程找到target(静态库) ->

QT中静态库的生成与使用

一. 静态库的生成    1. 测试目录: lib    2. 源码文件名: mywindow.h, mywindow.cpp, 类MyWindow继承于QPushButton, 并将文字设置为"I'm in class MyWindow";    3. 编写项目文件: mywindow.pro       注意两点:       TEMPLATE = lib       CONFIG   += staticlib    4. 生成Makefile:       qmake    5.

GCC实现多文件编译,静态库,动态库

一 代码 //add.h int add(int a, int b); //add.c int add(int a, int b) { return a+b; } //main.c #include <stdio.h> #include "add.h" void main() { printf("3 + 2 = %d\n",add(3+2)); } 二 多文件编译 1 生成.o文件 命令:gcc -c add.c main.c 生成:add.o,main

静态库与动态库的简单说明

一.静态库和动态库的简单介绍 程序设计的模块化是人们一直在追求的目标,因为当一个系统十分复杂的时候,将系统模块化既可以并行开发,又可以增强程序的可用性,降低程序间的耦合度.在一个复杂的多模块系统中, 各个模块编译完成后,会生成各自的目标文件*.o,最后通过链接器将各个模块链接起来生成可执行文件. 库其实就是一个模块文件.人们为了将一些功能模块提供给他人使用,同时又不想将源代码直接分发给别人(也可能是不需要,毕竟库使用更方便,不用重新编译),就将功能模块做成库, 外部应用通过链接库来加载库的功能模

打包静态库.a文件的方法(ar,ranlib,nm命令介绍)

一 常用脚本 1 打包脚本 脚本如下,下面附上ar 和 ranlib命令参考(命令来自于网络) ALLLIB=*.aFILE=`ls *.a`#原来的库解压重命名 for F in $FILEdo        ar x $F        OBJ=`ar t $F`        for O in $OBJ        do                mv $O ${F}_${O}        donedone #ar c 创建一个库,ar r 插入文件.ar s ==ranlib 向

iOS如何重新打包静态库,使得模拟器和真机都可以使用(以ZBarSDK为例)

ZBarSDK下载地址:https://github.com/bmorton/ZBarSDK http://zbar.sourceforge.net/iphone/index.html 1.创建工程 导入ZBar的SDK文件.即把ZBarSDK的目录拉入项目,然后选中copy选项 2.添加framework 3.添加代码 #import "ZBarSDK.h" #import "QRCodeGenerator.h" @interface yxpViewControl

cocoaPods打包的静态库

cocoaPods管理自己的静态库供其它人下载使用(直接使用上一篇用cocoaPod打包的静态库)(1) 创建github仓库 (2) 下载仓库到本地 (3) 将打包好的framework放到项目中 (4) 终端提交到github上 git add . git commit -m "install" git push origin master (5) 打标签, 并提交到github上 git tag 1.0.0 git push origin 1.0.0 二 (1) 在工程根目录初始