xcode編譯時,有第三方庫時,編譯設定build active architecture only問題

ysysbaobei發表於2013-11-17

1、http://blog.csdn.net/dengdengxiximeimei/article/details/8845621

 

關於Build Active Architecture Only屬性

 153人閱讀 評論(0) 收藏 舉報

這個屬性設定為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



編譯出的版本是向下相容的,比如你設定此值為yes,用iphone4編譯出來的是armv7版本的,iphone5也可以執行,但是armv6的裝置就不能執行。

 

所以,一般debug的時候可以選擇設定為yes,release的時候要改為no,以適應不同裝置。


2、http://blog.sina.com.cn/s/blog_45e2b66c0101bgep.html

build active architecture only設定:

新增一個.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)

具體相關設定如下:

build <wbr>active <wbr>architecture <wbr>only

用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了。


armv6、armv7、armv7s是arm CPU的指令集,一般是向下相容的。如iPhone4sCPU支援armv7,但它會相容armv6,只是使用armv6指令可能無法充分發揮它的特性。同理iPhone5是完全支援armv7的,所以不用擔心armv7的庫不能在iPhone5上跑,一般情況是不會出問題的。但需要提醒的是,蘋果是自Xcode4.5之後,就放棄了對armv6的支援,換言之,就是Xcode4.5正常情況是不能編譯armv6庫的(當然據說通過特殊手段可以支援,之前在網有看到一些在神的帖子,感興趣的可以搜搜)。還有一點提醒大家,就是可能Xcode4.5編譯的包沒有armv6,提交應用上傳時,會提示要支援armv6,當時此問題把我糾結了好一陣。後來我將支援的最低版本發為iOS4.3就OK。


另附加轉載:http://blog.csdn.net/yujie1985/article/details/8552650

 

armv6、armv7、armv7s是arm CPU的指令集,原則上是向下相容的,如:iPhone4sCPU支援armv7,但它會相容armv6,只是使用armv6指令可能無法充分發揮它的特性。iphone5CPU支援armv7s,它也會相容armv7。

如果引用到第三方的庫,以前在iphone4s下編譯沒有問題,但是換成iphone5之後,提示:

Undefined symbols for architecture armv7s:
  "_OBJC_CLASS_$_AMapView", referenced from:
      objc-class-ref in libMAMapKit.a(MAMapView.o)
ld: symbol(s) not found for architecture armv7s

大體意思是:引用自XX.a靜態庫的XX類不支援armv7s指令

原因是:你引用的靜態庫確實不支援armv7s,那麼你要想順利編譯通過,要麼通知開發修改,等待支援了之後再測;要麼在target的build settings中的valid Architectures 將armv7s先暫時去掉,編譯就可以成功。(等待支援了之後,再新增上)

相關文章