Xcode12问题:ld: 为iOS模拟器构建,但链接到为iOS构建的目标文件,文件“xxx.framework/xxx”适用于架构arm64。

7

升级xcode12后,出现构建问题:

ld :building for iOS Simulator, but linking in object file built for iOS, file 'xxx.framework/xxx' for architecture arm64

它可以在iPhone上运行。


使用Xcode 11.*版本打开项目并将Vaild Architectures设置为空值,然后在Xcode 12上打开它,试一试,祝你好运。 - JNYJ
这对我不起作用 @JNYJ,而且 Xcode 11 中的 'Vaild Architectures' == 'VALID_ARCHS' 在 Xcode 12 中。 - burningsun
1个回答

22

构建设置编辑器不再包括有效体系结构构建设置“VALID ARCHS”,其使用也不被鼓励。相反,有一个新的被排除的体系结构构建设置(EXCLUDED ARCHS)。

Xcode 12实际上是Apple Silicon的垫脚石,但这种平台还不可用。但是,在该平台上,我们将获得基于arm64的macOS,在该平台上模拟器将运行在arm64架构上,而不是现在基于Intel的x86_64架构上。

Xcode通常依赖于“运行目标”来构建其库/应用程序。因此,当选择模拟器作为“运行目标”时,它会为可用的模拟器体系结构构建应用程序,当选择设备作为“运行目标”时,它会构建适用于该设备支持的体系结构(arm *)的应用程序。

xcodebuild在Xcode 12 +构建系统中认为arm64是模拟器的有效体系结构。因此,当选择模拟器作为运行目标时,它可以尝试对基于arm64的模拟器进行编译/链接(尚不可用)。因此,它向clang(++)发送一些-target标志,例如arm64-apple-ios13.0-simulator格式,clang尝试对基于arm64的模拟器进行构建/链接,最终在基于Intel的mac上失败。

xcodebuild只尝试在Release版本中执行此操作。为什么?因为“仅构建活动架构(ONLY_ACTIVE_ARCH)”构建设置通常仅针对“发布”配置设置为“否”。这意味着xcodebuild将尝试为所选运行目标的所有架构变体构建您的库/应用程序的发行版。对于模拟器运行目标,它将从现在开始包括x86_64和arm64,因为Xcode 12+中的arm64也是模拟器支持Apple Silicon的受支持架构。

简而言之,每当Xcode尝试使用命令行xcodebuild(默认为发行版构建,请参见项目设置的“常规”选项卡)或者在发布模式下构建时,它都会失败。因此,解决此问题的简单方法是在您的库/应用程序中将“仅构建活动架构(ONLY_ACTIVE_ARCH)”设置为Yes,即使是在发布模式下也要如此。

选择目标然后转到构建设置

解决该问题的步骤:

解决方案1:

  1. 选择项目目标
  2. 进入构建设置
  3. 选择全部
  4. 搜索“仅构建活动架构”
  5. 将仅构建活动架构设置为“Yes”,即使是在发布模式下也要这样。
  6. 再次构建

解决方案2:

  1. 选择项目目标
  2. 进入构建设置
  3. 全选
  4. 搜索“排除的架构”
  5. 在“任何iOS模拟器SDK”选项中,将“arm64”添加到Release和Debug模式中。
  6. 再次构建

输入图像描述


1
对于使用苹果芯片的 Mac 用户,解决方案#2 仍然有意义吗?我尝试了#1,似乎没有任何区别,这很奇怪,因为苹果芯片的 Mac 应该原生支持 arm64 模拟器。 - user482594
在这两种解决方案之后,尽管它能够构建,但它会显示无法在模拟器上安装,因为它找不到来自 lib RealmSwift.framework 的 Info.plist。我想知道是否没有将此库包含在构建过程中,因为(不确定)它仅支持 arm64 处理器。 - ofundefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接