修改于2017.1.25 使用Xcode Version 8.2.1

1.怎么创建.framework?

打开Xcode, 选择File ----> New ---> Project

选择iOS ----> Framework & Library ---> Cocoa Touch Framework。

点击Next ,按照流程一步一步的创建工程。

工程如下:我把昨天创建的.a库的文件拿过来用一下yooweiSDK.h和yooweiSDK.m。

一般系统自动生成的头文件我们可以将其他公开的头文件全部放在这里面

2.为.framework添加公开的头文件,如下图进行操作。

系统默认生成的头文件yooweiFramework.h默认在public里面,我们自己创建的默认在project里面,我们如果要公开的话,需要将其拖拽到public里面去。

show in finder

3.测试.framework

注意测试.framework时候 导入头文件的时候如下。

#import <yooweiFramework/yooweiFramework.h>

但是会报错:运行报错(Reason: Image Not Found)

为什么?因为.framework 创建后默认是动态库,在使用的时候需要额外加一个步骤,要把Framework同时添加到‘Embedded Binaries’中

添加成功后,测试成功

4、真机测试

ld: warning: ignoring file /Users/galahad/Desktop/yooweiTest/yooweiTestDemo/yooweiTest/yooweiFramework.framework/yooweiFramework, missing required architecture arm64 in file /Users/galahad/Desktop/yooweiTest/yooweiTestDemo/yooweiTest/yooweiFramework.framework/yooweiFramework (2 slices)

Undefined symbols for architecture arm64:

"_OBJC_CLASS_$_yooweiSDK", referenced from:

objc-class-ref in AppDelegate.o

ld: symbol(s) not found for architecture arm64

clang: error: linker command failed with exit code 1 (use -v to see invocation)

检测该framework支持什么架构:

模拟器上面打包的:

$ lipo -info /Users/galahad/Library/Developer/Xcode/DerivedData/yooweiFramework-fcezdhngqanqgjetshvbgtrhjoxp/Build/Products/Debug-iphonesimulator/yooweiFramework.framework/yooweiFramework

Architectures in the fat file: /Users/galahad/Library/Developer/Xcode/DerivedData/yooweiFramework-fcezdhngqanqgjetshvbgtrhjoxp/Build/Products/Debug-iphonesimulator/yooweiFramework.framework/yooweiFramework are: i386 x86_64

注意2点:命令依然使用的是lipo -info,但是一定要具体到yooweiFramework.framework/yooweiFramework文件。

真机上面打包的:

$ lipo -info /Users/galahad/Library/Developer/Xcode/DerivedData/yooweiFramework-fcezdhngqanqgjetshvbgtrhjoxp/Build/Products/Debug-iphoneos/yooweiFramework.framework/yooweiFramework

Architectures in the fat file: /Users/galahad/Library/Developer/Xcode/DerivedData/yooweiFramework-fcezdhngqanqgjetshvbgtrhjoxp/Build/Products/Debug-iphoneos/yooweiFramework.framework/yooweiFramework are: armv7 arm64

手动合并:

注意还是具体到yooweiFramework.framework里面的yooweiFramework文件

$ lipo -create /Users/galahad/Desktop/合并/真机/yooweiFramework.framework/yooweiFramework /Users/galahad/Desktop/合并/模拟器/yooweiFramework.framework/yooweiFramework -output /Users/galahad/Desktop/合并/yooweiFramework

$ lipo -info /Users/galahad/Desktop/合并/yooweiFramework

Architectures in the fat file: /Users/galahad/Desktop/合并/yooweiFramework are: i386 x86_64 armv7 arm64

注意:1、合成后将原来的无论是模拟器的还是真机的随便一个的该文件替换掉就可以了,其他的文件保留。

2、如果是在其他地方(比如桌面)新建立一个文件夹(比如桌面合并)来存放合并后的静态库文件,那么/Users/galahad/Desktop/桌面合并/yooweiFramework  后面的这个yooweiFramework静态库的名称不能少。

注意这里也是合并模拟器和真机,不是合并debug和relaese。

脚本合成:

1、新建Aggregate Target

Xcode--File--New--Target--cross-platform--Aggregate

选择New Run Script Phase

2、将下面脚本添加进去

# 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}/" # 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}"

scheme选择yooweiFrameworkScript, Run , 如果没有异常的话,会自动弹出生成的Framework文件框

3、检测一下

果然是支持: i386 x86_64 armv7 arm64

制作通用静态库

在ios 8 以前如果我们用了自己的动态库的话,那么是不可能上传appstore上面的。虽然ios8 以后允许使用动态库,但一般情况下还是使用静态库。

只需要修改一个参数即可生成静态库:(在yooweiFramework的build Settings 里面也可以)

run:自动弹出下面的内容

使用静态库的话,就可以把Framework从‘Embedded Binaries’中删除了

测试一下:

成功。

你可能遇到的问题:

1、如果你用的真机是iPhone5 C,生成的Framework竟然不支持armv7s,默认的Architectures竟然不包含armv7s。 在Architectures下增加armv7s,并选中。将Build Active Architecture Only 设置为NO。

手动添加以后,重新生成即可。

2、如果 SDK 有用到 Category,注意项目设置 Other Linker Flags 添加 -ObjC

-ObjC:加了这个参数后,链接器就会把静态库中所有的Objective-C类和分类都加载到最后的可执行文件中。否则可能会出现类似Implicit declaration of function '****' is invalid in C99 等问题。

-all_load:会让链接器把所有找到的目标文件都加载到可执行文件中,但是千万不要随便使用这个参数!假如你使用了不止一个静态库文件,然后又使用了这个参数,那么你很有可能会遇到ld: duplicate symbol错误,因为不同的库文件里面可能会有相同的目标文件,所以建议在遇到-ObjC失效的情况下使用-force_load参数。

-force_load:所做的事情跟-all_load其实是一样的,但是-force_load需要指定要进行全部加载的库文件的路径,这样的话,你就只是完全加载了一个库文件,不影响其余库文件的按需加载。

补充:.bundle文件的使用

有一种情况就是我们静态库里面的图片很可能跟我们项目里面的图片名字一样,就有可能将项目中的图片给覆盖掉,那么冲突就有了,所以静态库就有了存放图片的bundle。

我们需要建立一个bundle来存储文件。其实bundle就是一个特殊的文件夹,只不过是将文件夹命名为后缀为.bundle就行了。点击显示包内容,可以将图片拷贝进去。

向项目中拖入静态库的时候一定要将bundle  也拖进去,

这样的话加载图片的时候

就不能用

再比如获取静态库里面bundle里面的资源文件

NSString *pathStr = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"AIResource.bundle"];
NSBundle *pathBundle = [NSBundle bundleWithPath:pathStr];
    //获取Bundle里的资源路径
NSString *cacerPath = [pathBundle pathForResource:@"ca" ofType:@"cer"];
NSData *cerDate=[NSData dataWithContentsOfFile:cacerPath];

iOS 动态库、静态库 . framework 总结(2017.1.25 修改)的更多相关文章

  1. iOS开发中静态库之".framework静态库"的制作及使用篇

    iOS开发中静态库之".framework静态库"的制作及使用篇 .framework静态库支持OC和swift .a静态库如何制作可参照上一篇: iOS开发中静态库之" ...

  2. 【iOS开发之静态库、动态库】

    什么是库? 库 就是程序代码的集合, 是共享程序代码的一种方式,库一般分两类:开源库和闭源库.github中共享一般是开源库:闭源库分为:静态库和动态库,闭源库不开放源代码,是经过编译的二进制文件,一 ...

  3. iOS开发之静态库(五)—— 图片、界面xib等资源文件封装到静态框架framework

    编译环境:Macbook Air + OS X 10.9.2 + XCode5.1 + iPhone5s(iOS7.0.3) 一.首先将资源文件打包成bundle 由于bundle是静态的,所以可以将 ...

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

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

  5. 【iOS】编译静态库

    与java和.net一样,objc也由类库的概念,不过在在objc上一般叫库,库表示程序代码集合,可以共享给其他程序使用,库是编译后的二进制文件,因此不能看到源代码,多用于一些开放sdk(如百度地图s ...

  6. 关于iOS上的静态库

    最近再进行项目的真机调试,然后发现了一个天坑.就此研究了一些iOS上的静态库的使用: 首先我们是直接拿一个可以运行的项目来制作静态库的,网上大部分都是先创建静态库然后再写内容,看看我的方法. 1.把子 ...

  7. iOS开发之静态库.a 以及合并

    静态库和动态库 静态库和动态库的存在形式静态库: .a 和 .framework 动态库: .dylib 和 .framework 静态库和动态库在使用上的区别静态库:链接时,静态库会被完整地复制到可 ...

  8. C_动态库|静态库

    动态库 动态链接库简称DLL,同时以.dll 为后缀,主要用于提供代码和数据 dll 并不是所有数据都能被访问到,必须要进行导出 动态链接库在内存中始终只保存了一份数据,起到了节约内存的作用 生成动态 ...

  9. Linux 下动态库 / 静态库(依赖)

    一. 依赖动态库的动态库 libfun.so依赖动态库libtest.so(libfun.so动态库里的函数intnothing()调用了libtest.so里的intmytest()函数),而mai ...

  10. 【转】iOS编译OpenSSL静态库(使用脚本自动编译)

    原文网址:https://www.jianshu.com/p/651513cab181 本篇文章为大家推荐两个脚本,用来iOS系统下编译OpenSSL通用库,如果想了解编译具体过程,请参看<iO ...

随机推荐

  1. pl/sql连接远程oracle

    1.找到oracle安装程序下的网络配置助手 2.选中本地net服务,进行添加 3.输入远程oracle服务名 4.选中tcp协议 5.输入远程oracle的ip地址 6.在网络服务名处,随便输入一个 ...

  2. the django travel three[form表单验证]

    一:表单验证: 场景:因为浏览器的js可以被禁用,所以需要做后台的输入合法的验证. A:ajax发请求.需要注意的是ajax POST的数据的key值和form表单的里的字段名字一致,否则得不到验证! ...

  3. [LuoguP1462]通往奥格瑞玛的道路($SPFA+$二分)

    #\(\mathcal{\color{red}{Description}}\) \(Link\) 有一个图,求其在\(1-N\)的最短路小于一个给定值下,点权最大值的最小值. #\(\mathcal{ ...

  4. 1549: Navigition Problem (几何计算+模拟 细节较多)

    1549: Navigition Problem Submit Page    Summary    Time Limit: 1 Sec     Memory Limit: 256 Mb     Su ...

  5. windows服务初识

    参考网址1:http://www.vchome.net/dotnet/dotnetdocs/dotnet38.htm 参考网址2:http://zhidao.baidu.com/link?url=7- ...

  6. 内部元素一一相应的集合的算法优化,从list到hashmap

    说是算法优化,基本上是在吹牛,仅仅只是算是记录下,我写代码时候的思路.毕竟还是小菜鸟. 我要开一个party,与会者都是情侣,可是情侣并非一起过来的,而是有先有后,可是每位与会者来的时候都拿着一束鲜花 ...

  7. Ubuntu18.04编译S3的Linux SDK(Zeta)

    按照S3官方Wiki(http://www.sochip.com.cn/s3)的陈述,推荐使用Ubuntu16.04作为Host端系统,笔者是一名乐于并热衷于尝鲜的搬砖工,于是,尝试在最新的18.04 ...

  8. Win10 安装 MongoDB 3.6.5 失败的问题

    MongoDB 3.6.5 2008R2Plus SSL (64 bit) Setup Wizard ended prematurely 在安装 MongoDB 的时候,出现了MongoDB 3.6. ...

  9. 20155235 《网络攻防》 实验一 逆向及Bof基础实践说明

    20155235 <网络攻防> 实验一 逆向及Bof基础实践说明 实验目的 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函 ...

  10. spring源码学习(一):eclipse导入spring源码

    前言 对于一门技术,我们最先是了解它(what),然后再熟练的使用它(how)以及何时用它(when),最后肯定要看透它(why).spring作为Java开发人员可以说是最熟悉不过的了,基本每个Ja ...