修改于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、将下面脚本添加进去

  1. # Sets the target folders and the final framework product.
  2. # 如果工程名称和Framework的Target名称不一样的话,要自定义FMKNAME
  3. # 例如: FMK_NAME = "MyFramework"
  4. FMK_NAME=${PROJECT_NAME}
  5.  
  6. # Install dir will be the final output to the framework.
  7. # The following line create it in the root folder of the current project.
  8. INSTALL_DIR=${SRCROOT}/Products/${FMK_NAME}.framework
  9.  
  10. # Working dir will be deleted after the framework creation.
  11. WRK_DIR=build
  12. DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.framework
  13. SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework
  14.  
  15. # -configuration ${CONFIGURATION}
  16. # Clean and Building both architectures.
  17. xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphoneos clean build
  18. xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator clean build
  19.  
  20. # Cleaning the oldest.
  21. if [ -d "${INSTALL_DIR}" ]
  22. then
  23. rm -rf "${INSTALL_DIR}"
  24. fi
  25.  
  26. mkdir -p "${INSTALL_DIR}"
  27.  
  28. cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
  29.  
  30. # Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product.
  31. lipo -create "${DEVICE_DIR}/${FMK_NAME}" "${SIMULATOR_DIR}/${FMK_NAME}" -output "${INSTALL_DIR}/${FMK_NAME}"
  32.  
  33. rm -r "${WRK_DIR}"
  34.  
  35. 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. python range函数与numpy arange函数,xrange与range的区别

    转自:https://www.cnblogs.com/ymjyqsx/p/6426764.html 1.range()返回的是range object,而np.arange()返回的是numpy.nd ...

  2. smtp outlook邮件发送非授权码模式

    1.起因:send fail SMTP AUTH extension not supported by server. 使用端口25 和587均失效出现此问题 首先前往outlook修改设置pop和I ...

  3. C++网络爬虫的实现——WinSock编程

    写了一个网络爬虫,可以抓取网上的图片. 需要给定初始网站即可. 在vs2010中编译通过. 需要使用多字节字符集进行编译, vs2010默认的是Unicode字符集. 编译后,运行即可,有惊喜哦!!! ...

  4. Cocos2d-x 3.0新引擎文件夹结构

    Cocos2d-x 3.0新引擎文件夹结构 2014年4月29日  Cocos2d-x 3.0学习 作为一个Cocos2d-x的菜鸟,我倒是挺愿意关注不同版本号之间的差别,Cocos2d-x 3.0自 ...

  5. 内存管理与正则(re)模块

    内存管理 垃圾回收机制 不能被程序访问到的数据,就称之为垃圾 也就是失去了一个能够访问到值数据的名称空间,导致在内存中无作为 引用计数:是内存管理的原理 引用计数是用来记录值的内存地址被记录的次数 每 ...

  6. 前端获取table表格里面的所有(单个)tr和所有(单个)td,用js实现

    今天在做项目遇到了一个问题,就是获取不到table里面的td. 本来是打算使用jq来解决的,但网上大部分人使用的都是获取到table标签然后点出他的children函数,我的前端页面没有这个函数,然后 ...

  7. C++ 函数的二义性

    函数二义性是一种编译时发生的错误,造成二义性调用的原因 是在函数匹配时两个或多个函数提供的匹配一样好,编译时找 不到唯一的最佳匹配. 列: #include <iostream> usin ...

  8. ruby的循环控制命令loop等

    ruby的循环有以下几种: times方法 for while until(与while相反) each(与for极度相似,在ruby内部,for语句是用each实现的) loop(无限循环,与bre ...

  9. CTF-Bugku-分析-信息提取

    CTF-Bugku-分析-信息提取 最近刷题的时候看到了这道比较有趣的题.而且网上也没找到wp,所以分享一下我的思路. 信息提取: 题目链接:http://ctf.bugku.com/challeng ...

  10. PostgreSQL PITR实验

    磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面: PostgreSQL基础知识与基本操作索引页     回到顶级页面:PostgreSQL索引页 看PostgreSQL中与PITR相关的设定 ...