簡體   English   中英

Xcode 5和iOS 7:架構和有效架構

[英]Xcode 5 and iOS 7: Architecture and Valid architectures

我正在Xcode 5中開始新項目。我想使用iOS SDK 7開發應用程序,但部署目標是iOS 5.0 一旦我在Xcode中創建新項目並嘗試將部署目標更改為5.0,我就收到此消息:

Applications including an arm64 slice are not compatible with versions of iOS
prior to 6.0
Adjust your Architectures build setting to not include arm64 in order to deploy
to releases prior to iOS 6.0.

因此將架構更改為Standard (無64位)。 我編譯,運行,但我真的不明白剛剛發生了什么。

Xcode項目構建設置中的Valid architectures ArchitecturesValid architectures設置之間有什么區別?
如果我將Architectures設置為排除64位當我在64位iPhone或iOS模擬器上運行我的應用程序時會發生什么(我知道它有效,我只是好奇下面有什么問題)?
你能用新的64位架構來解釋大混亂嗎?

在此輸入圖像描述

將構建設置中的體系結構設置為標准體系結構(armv7,armv7s)

在此輸入圖像描述

iPhone 5S采用A7 64位處理器。 來自蘋果文檔

Xcode可以構建包含32位和64位二進制文​​件的應用程序。 這種組合二進制文件需要iOS 7或更高版本的最低部署目標。

注意:Xcode的未來版本將允許您創建一個支持iOS 6及更高版本上的32位運行時的應用程序,並支持iOS 7上的64位運行時。

從文檔中我理解的是

  • Xcode可以為單個應用程序創建64位32位二進制文​​件,但部署目標應該是iOS7。 他們將來會說它將是iOS 6.0
  • 32位二進制文​​件在iPhone 5S(64位處理器)中可以正常工作。

更新(Xcode 5.0.1)
在Xcode 5.0.1中,他們添加了對iOS 5.1.1以后創建64位二進制文​​件的支持。

Xcode 5.0.1可以構建包含32位和64位二進制文​​件的應用程序。 此組合二進制文件需要iOS 5.1.1或更高版本的最低部署目標。 64位二進制文​​件僅在運行iOS 7.0.3及更高版本的64位設備上運行。

更新(Xcode 5.1)
Xcode 5.1在架構部分做了重大改變。 這個答案將是您的后續跟進。 檢查一下

當你設置64位時,生成的二進制文件是一個“Fat”二進制文件,它包含所有三個與瘦胖文件頭捆綁在一起的Mach-O圖像。 你可以看到使用otool或jtool。 您可以查看一些包含在iOS 7.0 SDK中的胖二進制文件,例如AVFoundation Framework,如下所示:

% cd  /Developer/Platforms/iPhoneOS.platform/DeviceSupport/7.0\ \(11A465\)/Symbols/System/Library/Frameworks/AVFoundation.framework/

%otool -V -f AVFoundation                                                                     9:36
Fat headers
fat_magic FAT_MAGIC
nfat_arch 3
architecture arm64     # The 64-bit version (A7)
    cputype CPU_TYPE_ARM64
    cpusubtype CPU_SUBTYPE_ARM64_ALL
    capabilities 0x0
    offset 16384
    size 2329888
    align 2^14 (16384)
architecture armv7        # A5X - packaged after the arm64version
    cputype CPU_TYPE_ARM
    cpusubtype CPU_SUBTYPE_ARM_V7
    capabilities 0x0
    offset 2359296
    size 2046336
    align 2^14 (16384)
architecture armv7s       # A6 - packaged after the armv7 version
    cputype CPU_TYPE_ARM
    cpusubtype CPU_SUBTYPE_ARM_V7S
    capabilities 0x0
    offset 4407296
    size 2046176
    align 2^14 (16384)

至於二進制本身,它使用ARM64位指令集,它(主要與32位兼容,但是)完全不同的指令集。 這對於圖形程序(使用NEON指令和寄存器)尤為重要。 同樣,CPU有更多寄存器,這對程序速度有很大影響。 http://blogs.barrons.com/techtraderdaily/2013/09/19/apple-the-64-bit-question/?mod=yahoobarrons中有一個有趣的討論是否會產生影響; 到目前為止,基准測試已明確表明它確實如此。

使用otool -tV將轉儲程序集(如果你有XCode 5及更高版本),然后你可以看到自己的指令集差異。 大多數(但不是全部)開發人員將對變化保持不可知,因為大多數情況下他們並不直接影響Obj-C(盡管CG * API),並且必須在低級指針處理方面做更多事情。 編譯器將實現其魔術和優化。

我對Apple Docs的理解。

  • 什么是架構 (ARCHS)到Xcode構建設置?
    • 指定二進制值為TARGETED的體系結構。 當指定多於一個體系結構時,生成的二進制文件可以包含每個指定體系結構的目標代碼。
  • 什么是有效架構 (VALID_ARCHS)到Xcode構建設置?

    • 指定二進制可能為BUILT的架構。
    • 在構建過程中,此列表與ARCHS相交,結果列表指定二進制文件可以運行的體系結構。
  • 示例: - 一個iOS項目在Xcode中具有以下構建設置。

    • ARCHS = armv7 armv7s
    • VALID_ARCHS = armv7 armv7s arm64
    • 在這種情況下,將為armv7 armv7s arm64架構構建二進制文件。 但是相同的二進制文件只能在ARCHS = armv7 armv7s上運行。

通過從支持的體系結構中刪除arm64設置,您無需將編譯器限制為僅限armv7armv7s 您只需將部署目標設置設置為5.1.1

重要說明:您無法在“ 構建設置”部分中將“部署目標”設置為5.1.1,因為它僅使用固定值下拉。 但只需在文本字段中鍵入值,即可在應用程序設置的常規部分輕松將其設置為5.1.1。

簡單修復:

目標 - >構建設置 - >構建選項 - >啟用Bitcode - >否

適用於iOS 9.3.3的設備

沒有任何答案有效,然后我忘記設置最低部署目標,可以在項目 - > 常規 - > 部署信息 - > 部署目標 - > 8.0中找到

例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM