xcode12 issus:ld:用于iOS Simulator的构建,但是链接用于iOS的目标文件,用于体系结构arm64的文件“ xxx.framework / xxx”

时间:2020-09-17 06:06:49

标签: ios xcode xcode12

升级xcode12后,构建issus:

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

它可以在iPhone上运行

1 个答案:

答案 0 :(得分:3)

“构建设置”编辑器不再包含“有效体系结构”构建设置“ VALID ARCHS”,因此不建议使用。相反,有一个新的“排除的体系结构”构建设置(排除的ARCHS)

Xcode 12实际上是Apple Silicon的垫脚石,不幸的是尚无此产品。但是有了该平台,我们将获得基于arm64的macOS,与现有的基于Intel的x86_64架构不同,仿真器也将在arm64架构上运行。

Xcode通常依靠“运行目标”来构建其库/应用程序。因此,当一个模拟器被选择为“运行目的地”,它构建的应用程序可用的模拟器架构和当设备被选择为“运行目的地”它建立了架构,该装置支撑件(臂*)

在xcode 12+构建系统中,

xcodebuild将arm64视为模拟器的有效体系结构。所以,当一个模拟器被选为运行目标,它可能尝试编译/针对基于arm64模拟器链接你的库/应用程序,以及(尚未公布)。因此,它以---格式向clang(++)发送一些-target标志,例如arm64-apple-ios13.0-simulator,clang尝试针对基于arm64的模拟器构建/链接,该模拟器最终在基于Intel的mac上失败。 >

但是xcodebuild仅在Release版本中尝试这样做。为什么?因为“仅构建活动体系结构(ONLY_ACTIVE_ARCH)”构建设置通常仅对“发布”配置设置为“否”。这意味着xcodebuild将尝试为选定的运行目标为发行版本构建libs / apps的所有体系结构变体。对于Simulator的运行目标,它将同时包含x86_64和arm64,因为Xcode 12+中的arm64也是模拟器所支持的体系结构,以支持Apple Silicon。

简单地说,Xcode在尝试使用命令行xcodebuild(默认为释放构建,请参见项目设置的常规选项卡)或以释放模式运行时,均无法构建您的应用程序。因此,解决此问题的简单方法是在您的库/应用程序中将“仅构建活动体系结构(ONLY_ACTIVE_ARCH)”设置为“是”,即使对于发布模式也是如此。

Select Traget then go to build setting

解决此问题的步骤:

解决方案1:

  1. 选择项目目标
  2. 进入构建设置
  3. 全选
  4. 搜索“仅构建活动架构”
  5. 即使对于发布模式,也仅将Active Architecture构建为“是”。
  6. 再次构建

解决方案2:

  1. 选择项目目标
  2. 进入构建设置
  3. 全选
  4. 搜索“排除的体系结构”
  5. 为“任何iOS模拟器SDK”选项将“ arm64”添加到发布和调试模式。
  6. 再次构建

enter image description here