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的性能。


================================================

关于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:iPod5, iPhone5,iPhone5C

arm64: iPhone5s, iPhone6


编译出的版本是向下兼容的,比如你设置此值为yes,用iphone4编译出来的是armv7版本的,iphone5也可以运行,但是armv6的设备就不能运行。所以,一般debug的时候可以选择设置为yes,release的时候要改为no,以适应不同设备。


================================================

编译问题案例1

================================================

使用pod install引入第三方库后
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了。

0 0
原创粉丝点击