美文网首页iOS学习交流iOSiOS进阶指南
使用XCode7打包动态库/静态库

使用XCode7打包动态库/静态库

作者: Weelh | 来源:发表于2016-03-31 10:58 被阅读2467次

使用XCode7打包动态库/静态库

@(▶开发)[iOS,Xcode]
文章同步在个人主页~

[TOC]

iOS中的静态库和动态库

概念

静态库(Static Library)
.a 为后缀,它是你的源码的实现.m文件编译而成的二进制文件集合,需要配合上暴漏的.h文件使用,它在引用链接时拷贝至可执行文件中,程序运行时加载到内存,期间被多次使用就有多份冗余拷贝和加载;
动态库(Dynamic Framework)
.dylib.framework为后缀,也是一堆.h和.m的集合,.m同样被编译成了二进制,不同的是,它还可以包含nib文件,资源文件等,系统的framework在链接时先检查内存中是否已经加载,如果有,就不再进行复制,这样多个应用程序可以共享内存中得同一份库文件,节省了内存.

注意:
1.在iOS8之前,或者xcode6之前,你可能也见过开发者自己打包的framework,具体方法可以看这里这里,但是,这些辛苦打包出来的framework依然是静态库的形式(程序运行时被加载到内存,即便此时内存中其他应用也用了此framework并且已经加载进内存了);
2.系统的.framework是动态库,也就是说我们代码中最常见的#import <Foundation/Foundation.h>导入的foundation框架,当我们运行程序的时候,其实内存中已经预加载了这些系统框架,此时我们打开应用时不会再次加载这些,这就减少了内存的占用.虽然在xcode6之后苹果爸爸允许我们自己生成framework了,但是,它依然只是存在于当前应用的沙盒中而非提交到系统中,这就意味着每次依然会加载到内存中...

创建自己的framework

相比较于静态库,动态库有着自己的优势,除去上文中说道的资源包含和内存加载问题,在使用的时候相比较于.a的静态库也更方便,因为它本省包含了我们所需要的所有资源(自包含);所以我建议,我们更应该生成动态framework而非.a静态库;

为已有类扩展分类使我们经常的做法,现在我们将实例如何将分类打包成framework使用;
1.新建工程->选择iOS下Framework&Library->CocoaTouch Framework;

2.将我们的要打包的文件拖进工程,这里不要建立文件夹(图1);

图1
可以看到这里有一个额外的文件XCommonExtension.h,它在我们生成工程之后自动为我们生成,这里你可以将打包的public文件都通过import的方式导入头文件到这里,在其他开发者使用framework的时候只用引用这个.h头文件即可;

3.在build phases中,我们可以看到有一个Headers的选项,我们上一步添加的文件都会在这里显示,不过默认的是在project下,这里我们需要把需要暴露的拖动到public下,完成后如下(图2)

图2

4.Build-Run,到此,你的""模拟器版""的framework已经生成了,它只能在模拟器中链接引用,到真机运行的时候就有问题了,接下来,我们在生成真机版的framework,同时把他们合并成一个通用的framework;

5.选中target->在工具栏点击Editor->Add Target->在弹出的选择框中选择Other->Aggregate->Next;现在你的工程总有了两个target(图3)

图3

6.选中刚加入的这个target,点击右上的 + 号 -> New Run Script Phase,我们将在这里嵌入我们的脚本script;

# Sets the target folders and the final framework product.
# 如果工程名称和Framework的Target名称不一样的话,要自定义FMKNAME
# 例如: FMK_NAME = "MyFramework"
FMK_NAME=${PROJECT_NAME}
# Install dir will be the final output to the framework.
# The following line create it in the root folder of the current project.
INSTALL_DIR=${SRCROOT}/Products/${FMK_NAME}.framework
# Working dir will be deleted after the framework creation.
WRK_DIR=build
DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.framework
SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework
# -configuration ${CONFIGURATION}
# Clean and Building both architectures.
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphoneos clean build
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator clean build
# Cleaning the oldest.
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
mkdir -p "${INSTALL_DIR}"
cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
cp -R "${SIMULATOR_DIR}/" "${INSTALL_DIR}/"
# Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product.
lipo -create "${DEVICE_DIR}/${FMK_NAME}" "${SIMULATOR_DIR}/${FMK_NAME}" -output "${INSTALL_DIR}/${FMK_NAME}"
rm -r "${WRK_DIR}"
open "${INSTALL_DIR}"

将以上代码段复制,粘贴在Run Script下Shell下方的黑框中;

7.选中新加入的这个Scheme,编译运行(图4);

图4

8.编译运行之后你的finder就会弹出生成的framework,找到并拷贝出来,大功告成,下面我们就可以使用它了;

使用我们的framework

9.在新建的工程中加入我们生成的framework,在Embedded Framework中加入我们的framework,在要使用的文件中引入头文件;

import <XCommonExtension/XCommonExtension.h>

注意:
1.这里我们打包的为分类,在使用的时候,需要在other linker flag中添加-ObjC或者-force_load参数;
2.带有图片资源的需要把图片打包成Bundle文件,和framework一起拷贝到相应的项目中.

到此为止,我们制作出来了可供使用的framework,如果想要更多人使用到你的framework,你可以利用cocoaPods,编写自己的PodSpec文件,或者利用Carthage,发布你的framework;

-over-

相关文章

  • 使用XCode7打包动态库/静态库

    使用XCode7打包动态库/静态库 @(▶开发)[iOS,Xcode]文章同步在个人主页~ [TOC] iOS中的...

  • iOS静态库与动态库的区别与打包

    iOS静态库与动态库的区别与打包iOS静态库与动态库的区别与打包

  • 目录一、库二、静态库、动态库、Framework三、打包静态库 1、.a静态库和.framework静态库的区别 ...

  • Linux链接库

    动态链接库(共享链接库) 杂项 生成.o文件 生成.so 使用动态库 静态链接库 杂项 生成.a 查看.a 使用静态库

  • iOS, Xcode12,项目提示第三方库报错无法运行 bund

    检查你有没有把静态库和动态库配置错误!! 下图处是配置动态库的地方! 对于动态库和静态库都有使用的时候,注意把静态...

  • iOS bundle format unrecognized,

    检查你有没有把静态库和动态库配置错误!! 下图处是配置动态库的地方! 对于动态库和静态库都有使用的时候,注意把静态...

  • 使用g++创建动态库和静态库及其相关探索

    使用g++创建动态库和静态库及其相关探索目录使用g++创建动态库和静态库及其相关探索0.前期准备1.静态库创建及链...

  • iOS 动态库和静态库

    一、简介 静态库和动态库的存在形式 静态库和动态库在使用上的区别 静态库:链接时,静态库会被完整地复制到可执行文件...

  • iOS 静态库和动态库的制作

    静态库和动态库 一、静态库和动态库的存在形式 静态库: .a 和 .framework 动态库: .dylib 和...

  • IOS - 程序加载过程

    静态库 动态库 静态库:.a文件 静态库会被完整地复制到可执行文件中。被多次使用就有多份冗余拷贝 动态库:.dyl...

网友评论

  • dbbe0167ce9d:请问下,C++文件打包成静态库可以直接调用么

本文标题:使用XCode7打包动态库/静态库

本文链接:https://www.haomeiwen.com/subject/bauelttx.html