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 ...
随机推荐
- 记录一下iOS Leak的使用方法。
观测过程中不需要使用xcode.只需观察Leak工具即可 1:选中Xcode,点击左上角的Xcode.找到tool 然后找到instrument.如下图 2:打开instrument 找到Leak ...
- C#引用比较和内容比较
1.静态方法Object.ReferenceEqual,实际实现为引用比较. 2.静态方法Object.Equal, 实际实现为引用比较.(实际调用了实例方法Equal) 3.Object实例 ...
- 数据库分库分表和带来的唯一ID、分页查询问题的解决
需求缘起(用一个公司的发展作为背景) 1.还是个小公司的时候,注册用户就20w,每天活跃用户1w,每天最大单表数据量就1000,然后高峰期每秒并发请求最多就10,此时一个16核32G的服务器,每秒请求 ...
- [原创]升级Gerrit的commit-msg,检查git commit时必须填写开发任务编号TaskID
公司使用git+gerrit+jenkins进行持续集成实践,其中gerrit用来进行Code Review.另外我们自己研发了一套敏捷项目管理系统TPM(TeamPlus Management),用 ...
- bootstrap-treeview使用
1.数据 var tree = [{ text: "车型A", nodes: [{ text: "车系1", }, { text: "车系2" ...
- 大数据入门:Hadoop安装、环境配置及检测
目录 1.导包Hadoop包 2.配置环境变量 3.把winutil包拷贝到Hadoop bin目录下 4.把Hadoop.dll放到system32下 5.检测Hadoop是否正常安装 5.1在ma ...
- 使用git管理代码
上传工程 1.登录github后,点击右上角带有+号的图标,输入仓库名创建仓库(Repository). 2.在项目文件夹下执行以下命令: touch README.md git init 如果工程中 ...
- 2017-2018-2 《网络对抗技术》 20155322 Exp4 恶意代码分析
[-= 博客目录 =-] 1-实践目标 1.1-实践介绍 1.2-实践内容 1.3-实践要求 2-实践过程 2.1-Mac下网络监控 2.2-Windows下网络监控 2.3-Mac下恶意软件分析 2 ...
- 使用源安装java JDK
使用下面的命令安装,只需一些时间,它就会下载许多的文件,所及你要确保你的网络环境良好: sudo add-apt-repository ppa:webupd8team/java sudo apt-ge ...
- CF13E Holes LCT
CF13E Holes LG传送门 双倍经验题,几乎同[HNOI2010]弹飞绵羊,LCT练手题,LG没有LCT题解于是发一波. 从当前点向目标点连边,构成一棵树,带修改就用LCT动态维护答案,由于不 ...