打包framework 涉及到得架构问题

摘要:
个人遇到的问题,纠结了一早上,终于搞定了问题:生成的framework在模拟器5s中测试,一直报错:缺少对x86_64为架构的支持。但是真机能运行然后就一直在修改Architectures,把所有跟Architecture相关的地方都改成armv7、armv7s、arm64、i386、x86_64补全所有的架构,然后打包出来的framework也报错。

一、在项目开发过程中 ,为了适配不通的设备 ,需要我们手动的增加支持设备的架构。那么就需要我们对苹果手机对应的架构所有了解

现在列出目前需要适配的集中机型对应的架构

打包framework 涉及到得架构问题第1张

上图中还少一个基于模拟器的x86_64位得架构

打包framework 涉及到得架构问题第2张

我们在打包framework时,不可避免的要对架构进行设置。如下图:

打包framework 涉及到得架构问题第3张

现对上诉字段进行说明:一下文字引用自网页:http://www.tuicool.com/articles/aeiaUr

Architectures
这代表,在这个项目里你想要Xcode编译的目标设备列表。
Valid Architectures
还不是太明确这个设置的意图,但是一般来说是不需要更改的,和Architectures一样就可以。

在Xcode6.1.1里的Valid Architectures设置里,默认为Standard architectures(armv7,arm64),如果你想改的话,自己在other中更改。

原因解释如下:
使用standard architectures (including 64-bit)(armv7,arm64)参数,则打的包里面有32位、64位两份代码,

在iPhone5s(iPhone5s的cpu是64位的)下,会首选运行64位代码包,

其余的iPhone(其余iPhone都是32位的,iPhone5c也是32位),只能运行32位包,

但是包含两种架构的代码包,只有运行在ios6,ios7系统上。

这也就是说,这种打包方式,对手机几乎没啥要求,但是对系统有要求,即ios6以上。
而使用standard architectures (armv7,armv7s)参数,则打的包里只有32位代码,iPhone5s的cpu是64位,但是可以兼容32位代码,即可以运行32位代码。但是这会降低iPhone5s的性能。其余的iPhone对32位代码包更没问题,而32位代码包,对系统也几乎也没什么限制。
所以总结如下:

要发挥iPhone5s的64位性能,就要包含64位包,那么系统最低要求为ios6。如果要兼容ios5以及更低的系统,只能打32位的包,系统都能通用,但是会丧失iPhone5s的性能。

Build Active Architecture Only

这个属性设置为yes,是为了debug的时候编译速度更快,它只编译当前的architecture版本。
而设置为no时,会编译所有的版本。
这个是设备对应的architecture:
armv6:iPhone 2G/3G,iPod 1G/2G
armv7:iPhone 3GS/4/4s,iPod 3G/4G,iPad 1G/2G/3G
armv7s:iPhone5, iPod5
arm64:iPhone5s,ipad air,ipad mini2
编译出的版本是向下兼容的,比如你设置此值为yes,用iphone4编译出来的是armv7版本的,iphone5也可以运行,但是armv6的设备就不能运行。
所以,一般debug的时候可以选择设置为yes,release的时候要改为no,以适应不同设备。

个人遇到的问题,纠结了一早上,终于搞定了

问题:生成的framework在模拟器5s 中测试,一直报错:缺少对x86_64为架构的支持。但是真机能运行

然后就一直在修改Architectures ,把所有跟Architecture相关的地方都改成armv7、armv7s、arm64、i386、x86_64 补全所有的架构,然后打包出来的framework也报错。

然后在我把所有的设置都删掉,重来,只添加了最基本的三种结构(armv7、armv7s、arm64)以后,打包出来的包居然可以在模拟器和真机中同时运行 ,亲测所有的模拟器都可以运行 ,现贴出Architecture 的设置截图:

打包framework 涉及到得架构问题第4张

只要保证打包framework的项目和引用framework的项目按照上图设置,就不会出现恶心的缺少对某一种架构的定义了 。

三、打包framework。不得不提的就是合成包、虽然这会导致app包得容量增大,但是无疑是一种比较方便得方法

合成包得两个方法:1、利用终端,手动合成、

lipo -create/所在路径/Release-iphoneos/libMyStaticLibraryDemo.a/所在路径/Release-iphonesimulator/libMyStaticLibraryDemo.a-output/Users/pingk/Desktop/libUniversal.a
另一种方法就是在项目中新增脚本来完成
打包framework 涉及到得架构问题第5张
贴出脚本代码:

# Sets the target folders and the final framework product.

# 如果工程名称和FrameworkTarget名称不一样的话,要自定义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}"

运行:

打包framework 涉及到得架构问题第6张

经过接近1分钟的等待以后,脚本回打开包所在的路径。如下图:

打包framework 涉及到得架构问题第7张

执行中,比编译一般得app要慢,执行完以后,回自动弹出窗口

打包framework 涉及到得架构问题第8张

此时,将包拷贝出来,或者直接拖到要用的项目工程里,不用反复的选中包。然后执行show in finder 的操作了 。

真心推荐

免责声明:文章转载自《打包framework 涉及到得架构问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇MySQL返回列名uni-app引入自定义图标库下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MySQL集群常见高可用方案(转)

1. 概述 我们在考虑MySQL数据库的高可用的架构时,主要要考虑如下几方面: 如果数据库发生了宕机或者意外中断等故障,能尽快恢复数据库的可用性,尽可能的减少停机时间,保证业务不会因为数据库的故障而中断。 用作备份、只读副本等功能的非主节点的数据应该和主节点的数据实时或者最终保持一致。 当业务发生数据库切换时,切换前后的数据库内容应当一致,不会因为数据缺...

遗留系统维护的思考

不像发达国家,我们现在还在处在软件开荒时期,不断在开发着新的软件。但随着软件已经成为各行各业中的重要的基础设施,我觉得软件维护这个话题将变得越来越重要。 据统计,可能80%的维护人员都不是以前的开发人员。所以,软件维护首要面临的是对当前软件系统的理解,这次我就这个话题说一下我自己的理解。目前只能想到几点,希望大家能够补充。 那么应该从哪几方面来理解呢?...

Dubbo与Nginx微服务架构

Dubbo的负载均衡已经是服务层面的了,和nginx的负载均衡还在http请求层面完全不同。至于二者哪个优秀,当然没办法直接比较。 涉及到负载均衡就涉及到你的业务,根据业务来选择才是最适合的。 dubbo具备了server注册,发现、路由、负载均衡的功能,在所有实现了这些功能的服务治理组件中,个人觉得dubbo还是略微笨重了,因为它本身是按照j2EE范畴所...

Spring 核心技术与产品理念剖析【下】

3. Spring Cloud 蝶变重生 Spring 框架的升级演进都是围绕分层架构进行的,从简单到复杂,再回到简单的过程。如果我们没有经历过 Spring 最开始繁琐的配置,然后一步步精简,就根本体会不到为什么会有 Spring Boot。俗话说,乱世造英雄。在新旧时代交替阶段,原来统治世界的旧秩序正在慢慢失效,而新秩序尚未成型,那些建立或者依赖旧秩序...

c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥

对于微软开发者来说,每次BUILD大会都是值得期待的。这次也是惊喜满满,除了大众瞩目的WP8.1的发布还有一项会令开发者兴奋的技术出现:.NET NATIVE。下面就来详细了解一下其为何物。 [小九的学堂,致力于以平凡的语言描述不平凡的技术。如要转载,请注明来源:小九的学堂。cnblogs.com/xfuture]    .Net当初的出现是因为Java...

win7 安装.Net framework 4.0出现 安装不成功,错误代码0x80240037 的解决方法

1.安装说明 系统:win7 64位 安装包:dotNetFx40_Full_x86_x64.exe(.Net framework 4.0) 出现的问题:在win7 上安装dotNetFx40_Full_x86_x64.exe之后,弹出说明框:.Net framework 4安装未成功,原因是hresult 0x80240037 后面也采用了各种方法,还发...