iOS Architecture
来源:互联网 发布:上古网络用语 编辑:程序博客网 时间:2024/06/04 19:47
================================================
Architecture : 指你想支持的指令集。
Valid architectures : 指即将编译的指令集。
Build Active Architecture Only : 只是否只编译当前适用的指令集。
================================================
使用 standard architectures (including 64-bit)(armv7,armv7s,arm64) 参数,则打的包里面有32位、64位两份代码,
在iPhone5s,iPhone6( iPhone5s的cpu是64位的 )下,会首选运行64位代码包,
在iPhone5,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的性能。
================================================
================================================
这个属性设置为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:iPod5, iPhone5,iPhone5C
arm64: iPhone5s, iPhone6
编译出的版本是向下兼容的,比如你设置此值为yes,用iphone4编译出来的是armv7版本的,iphone5也可以运行,但是armv6的设备就不能运行。所以,一般debug的时候可以选择设置为yes,release的时候要改为no,以适应不同设备。
================================================
编译问题案例1
================================================
Build Active Architecture Only 属性Debug版本设置为YES, Release版本设置为NO,编译正常。但是将Build Active Architecture Only 属性Debug版本和Release版本均设置为NO时,编译如下错误:
Undefined symbols for architecture arm64:
"_OBJC_CLASS_$_AFJSONRequestSerializer", referenced from:
objc-class-ref in ConfigureParameters.o
"_OBJC_CLASS_$_AFSecurityPolicy", referenced from:
objc-class-ref in ConfigureParameters.o
"_AFNetworkingOperationFailingURLResponseDataErrorKey", referenced from:
___71-[ConfigureParameters applayVerifyCodeWithAccount:WithCompletionBlock:]_block_invoke121 in ConfigureParameters.o
___82-[ConfigureParameters loginWithAccount:Password:andLoginType:WithCompletionBlock:]_block_invoke223 in ConfigureParameters.o
___88-[ConfigureParameters QueryWithAccount:Sessiontoken:andRequestmode:WithCompletionBlock:]_block_invoke252 in ConfigureParameters.o
___62-[ConfigureParameters logoutByExitReason:WithCompletionBlock:]_block_invoke271 in ConfigureParameters.o
"_OBJC_CLASS_$_AFJSONResponseSerializer", referenced from:
objc-class-ref in ConfigureParameters.o
"_OBJC_CLASS_$_AFHTTPResponseSerializer", referenced from:
objc-class-ref in SoapSelfService.o
"_OBJC_CLASS_$_AFHTTPRequestOperationManager", referenced from:
objc-class-ref in SoapSelfService.o
objc-class-ref in ConfigureParameters.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
/////////////////////////////////
或者出现链接错误,提示library not found for -lPods-AFNetworking类似的问题
参考https://github.com/QYL/v2ex/commit/ee53ed75c1f5c3e4f78e25432c73678fbf84a073 解决library not found for -lPods-AFNetworking问题
若出现 `ld: library not found for -lPods-AFNetworking` 类似的, 设置 `Project` -> `Pods` 下所有第三方库的 `Build Active Architecture Only` 为 `NO`
即选择左侧Pods工程,将右侧该工程下所有第三方库的`Build Active Architecture Only` 为 `NO`
================================================
编译问题案例2
================================================
添加一个.a文件到工程中,然后死活编译不过去,提示错误信息:
ld: warning: ignoring file /Users/test/Desktop/new31248/shell42/core/lib/Release-iphoneos/libPyConvertlib4Ipad.a, file was built for archive which is not the architecture being linked (armv7s): /Users/test/Desktop/new31248/shell42/core/lib/Release-iphoneos/libPyConvertlib4Ipad.a
Undefined symbols for architecture armv7s:
"*******(NSString*)", referenced from:
-[***** *****:] in *****.o
..............
ld: symbol(s) not found for architecture armv7s
clang: error: linker command failed with exit code 1 (use -v to see invocation)
用lipo -info 查看.a文件
:input file ******.a is not a fat file
Non-fat file: ******.a is architecture: armv7
说明.a文件只是一个armv7结构,而自己要编译的是要支持armv7和armv7s的fat file,于是可以将architectures属性(保罗release和debug)改为:armv7,这样可以编译过去。
也可以将Build Active Architecture Only 改为Yes,但是此种方法都是只会支持armv7和向下兼容,如果想要兼容armv7s,就最好将.a文件用armv7s 编译,这样就兼容armv7了。
- iOS Architecture
- IOS Audio Queue Architecture
- iOS开发之architecture相关
- Architecture
- ARCHITECTURE
- iOS :undefined symbols for architecture x86_64
- iOS duplicate symbols for architecture i386
- iOS Undefined symbols for architecture i386:
- 3、iOS duplicate symbols for architecture i386
- iOS :undefined symbols for architecture x86_64
- iOS :undefined symbols for architecture x86_64
- iOS错误:Undefined symbols for architecture arm64
- 【IOS】Undefined symbols for architecture x86_64
- iOS :undefined symbols for architecture x86_64
- iOS Undefined symbols for architecture x86_64:
- ios Undefined symbols for architecture arm64
- iOS :undefined symbols for architecture x86_64
- iOS调用静态库architecture问题总结
- Mac开机自动启动Interllij注册服
- java 根据 List<T> 的属性进行排序
- ReactNative初探
- 多路径 TCP
- POJ 2318 TOYS
- iOS Architecture
- Redis2.8.9初识(-)
- std::make_shared解释。。。。
- 连续属性离散化
- MySQL创建、修改表、表的约束
- 163.You want to access employee details contained in flat files as part of the EMPLOYEE table. You p
- Practice in groovy
- qsort函数的应用
- PL/SQL Server 的tnsname.ora注意事项