iOS 动态库、静态库 . framework 总结(2017.1.25 修改)
修改于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里面的资源文件
iOS 动态库、静态库 . framework 总结(2017.1.25 修改)的更多相关文章
- iOS开发中静态库之".framework静态库"的制作及使用篇
iOS开发中静态库之".framework静态库"的制作及使用篇 .framework静态库支持OC和swift .a静态库如何制作可参照上一篇: iOS开发中静态库之" ...
- 【iOS开发之静态库、动态库】
什么是库? 库 就是程序代码的集合, 是共享程序代码的一种方式,库一般分两类:开源库和闭源库.github中共享一般是开源库:闭源库分为:静态库和动态库,闭源库不开放源代码,是经过编译的二进制文件,一 ...
- iOS开发之静态库(五)—— 图片、界面xib等资源文件封装到静态框架framework
编译环境:Macbook Air + OS X 10.9.2 + XCode5.1 + iPhone5s(iOS7.0.3) 一.首先将资源文件打包成bundle 由于bundle是静态的,所以可以将 ...
- iOS开发中静态库制作 之.a静态库制作及使用篇
iOS开发中静态库之".a静态库"的制作及使用篇 一.库的简介 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的类型? 根据源代码的公开情况,库可以分为2种类 ...
- 【iOS】编译静态库
与java和.net一样,objc也由类库的概念,不过在在objc上一般叫库,库表示程序代码集合,可以共享给其他程序使用,库是编译后的二进制文件,因此不能看到源代码,多用于一些开放sdk(如百度地图s ...
- 关于iOS上的静态库
最近再进行项目的真机调试,然后发现了一个天坑.就此研究了一些iOS上的静态库的使用: 首先我们是直接拿一个可以运行的项目来制作静态库的,网上大部分都是先创建静态库然后再写内容,看看我的方法. 1.把子 ...
- iOS开发之静态库.a 以及合并
静态库和动态库 静态库和动态库的存在形式静态库: .a 和 .framework 动态库: .dylib 和 .framework 静态库和动态库在使用上的区别静态库:链接时,静态库会被完整地复制到可 ...
- C_动态库|静态库
动态库 动态链接库简称DLL,同时以.dll 为后缀,主要用于提供代码和数据 dll 并不是所有数据都能被访问到,必须要进行导出 动态链接库在内存中始终只保存了一份数据,起到了节约内存的作用 生成动态 ...
- Linux 下动态库 / 静态库(依赖)
一. 依赖动态库的动态库 libfun.so依赖动态库libtest.so(libfun.so动态库里的函数intnothing()调用了libtest.so里的intmytest()函数),而mai ...
- 【转】iOS编译OpenSSL静态库(使用脚本自动编译)
原文网址:https://www.jianshu.com/p/651513cab181 本篇文章为大家推荐两个脚本,用来iOS系统下编译OpenSSL通用库,如果想了解编译具体过程,请参看<iO ...
随机推荐
- SQLserver中取众位数的写法
取众位数:先按个数倒排序,再取第一条SELECT * FROM ( select a.billid,a.DemandVoltage,count(1) as RecordCount, Row_NUMBE ...
- c++中内存拷贝函数(C++ memcpy)详解
原型:void*memcpy(void*dest, const void*src,unsigned int count); 功能:由src所指内存区域复制count个字节到dest所指内存区域. 说明 ...
- 学习笔记——并行编程Parallel
Parallel 并行运算 参考资料:http://www.cnblogs.com/woxpp/p/3925094.html 1.并行运算 使用Parallel并行运算时,跟task很像,相当于tas ...
- beta冲刺后续讨论
目录 组员:胡绪佩 组员:何家伟 组员:黄鸿杰 组员: 翟丹丹 组员:周政演 组员:胡青元 组员:庄卉 组员:刘恺琳 组员:何宇恒 组员:刘一好 组员:葛家灿 组员:胡绪佩 总结 通过这次的Beta版 ...
- MVC view操作(Razor语法)
Razor,很有意思的剃刀.相较与之前开发WEB的方式,Razor真是轻松惬意. 下面说一下我使用Razor的一些心得. 页面中归根结底是一个输出字符串(HTML CSS JS等混合的字符串)的过程. ...
- Apache24 + php5.6.31 +Sql server R2 环境搭建①
win8(7)x64系统下 :PHP5.5.15 + Apache2.4.10 + SQL server 2008 R2 的配置方法分享给大家,32位的同理,不过下载的软件需要也是32位的. 好久未 ...
- JS form跳转到新标签页并用post传参
通过js实现跳转到一个新的标签页,并且传递参数.(使用post传参方式) 1 超链接<a>标签 (get传参) <a href="http://www.cnblogs. ...
- Spring第三天——AOP注解实现与事务管理
大致内容: aspectJ的aop操作(基于注解,对比day02配置操作)(会用) *jdbcTemplate操作(实现CRUD) *spring配置连接池 *spring事务管理 一.AspectJ ...
- APP性能测试中的几个重要概念
转载一篇文章,关于app性能测试的几个概念,对于想要接触app测试的朋友或许有些帮助. 我们在使用各种 App 的时候基本会关注到:这款软件挺耗流量的?运行起来设备掉电有点快嘛?切换页面的时候还会有卡 ...
- Idea for Mac 快捷键(快捷键选择:Mac OS X 10.5+)
删除一行 command + delete 查找 command + f 查找替换 command + r 复制一行 comma ...