当前位置: 首页 > 知识库问答 >
问题:

iOS模拟器的Xcode构建,但在为iOS构建的对象文件中链接,用于架构'arm64'

萧树
2023-03-14

我正在努力获得一个大的(并且正在使用Xcode 11!)在Xcode 12(beta 5)中构建项目,为iOS 14做准备。代码库以前在Objective-C中,但现在它同时包含Objective-C和Swift,并使用Objective-C和/或Swift的POD。

我已经推出了新的CocoaPods测试版,支持Xcode 12(目前为1.10.0.beta 2)。

Pod安装成功。当我进行构建时,在pod框架上会出现以下错误:

为iOS模拟器构建,但在为iOS构建的对象文件中链接,用于架构arm64

还有可能是错误:

无法加载目标“arm64-apple-ios11”的标准库。0'

当我在框架上运行lipo-info时,它有:armv7s armv7 i386 x86_64 arm64。

在此之前,该项目的有效架构设置为:armv7、armv7s和arm64。

根据苹果的文档,在Xcode 12中,这种设置消失了。架构设置为$(ARCHS_标准)。我没有任何设置。

这到底是怎么回事?我还没能用一个更简单的项目重现这一点。

共有3个答案

拓拔谭三
2023-03-14

我找到了一个解决方案!SwiftUI预览不适用于Firebase

如果您将模拟器的排除架构设置为arm64,它将编译

程祺
2023-03-14

太长别读;

对于您的库/应用程序,即使是在发布模式下,也要将“仅构建活动架构(仅构建活动架构_-Active_-ARCH)”设置为“是”。

在试图找出问题的根本原因时,我意识到了一些关于Xcode 12的有趣事实。

>

Xcode通常依赖“运行目的地”来构建其库/应用程序。因此,当模拟器被选为“运行目的地”时,它会为可用的模拟器架构构建应用程序,而当设备被选为“运行目的地”时,它会为设备支持的架构构建(arm*)。

xcodebuild,在Xcode 12构建系统中,将arm64视为模拟器支持苹果硅的有效架构。因此,当选择模拟器作为运行目标时,它可能还会尝试根据基于arm64的模拟器编译/链接libs/app。因此它发送clang()some-target标志,比如arm64-apple-ios13。0-模拟器in

但是,xcodebuild只在发布版本中尝试这种方法。为什么?因为,“仅构建活动体系结构(仅构建活动体系结构)”构建设置通常仅针对“发布”配置设置为“否”。这意味着xcodebuild将尝试为发布版本的选定运行目标构建libs/应用程序的所有体系结构变体。对于模拟器运行目标,它将包括x86_64arm64,因为Xcode 12中的arm64也是支持Apple silicon的模拟器的受支持架构。

简单地说,只要Xcode尝试命令行,xcodebuild,(默认为release build,请参阅项目设置的general选项卡)或其他方式,并尝试构建运行目标支持的所有体系结构变体,它就会无法构建您的应用程序。因此,解决这个问题的一个简单方法是在库/应用程序中,将“仅构建活动架构(仅构建活动架构”)”设置为“是”,即使在发布模式下也是如此。

如果库作为pod包含,并且您可以访问。podspec您可以简单地设置:

spec.pod_target_xcconfig={'仅活动_ARCH'=

spec.user_target_xcconfig={'ONLY_ACTIVE_ARCH'=

我个人不喜欢第二行,因为pods不应该污染目标项目,而且它可以在目标设置中被覆盖。因此,通过某种方式覆盖设置应该是消费者项目的责任。但是,这对于成功lint podspes可能是必要的。

但是,如果您无权访问. podspec,您可以随时在安装pod期间更新设置:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings["ONLY_ACTIVE_ARCH"] = "YES"
    end
  end
end

我担心的一件事是,当我们实际归档库和应用程序时,这会产生什么影响。在归档过程中,应用程序通常采用“发布”配置,因为这将创建一个只考虑当前运行目标的活动体系结构的发布版本,使用这种方法,我们可能会从目标版本中丢失armv7、armv7s等的切片。然而,我注意到文档中说(在附图中突出显示),当我们选择“通用iOS设备/任何设备”作为运行目标时,这个设置将被忽略,因为它没有定义任何特定的体系结构。所以我想,如果我们把应用程序归档,选择它作为跑步目的地,我们应该会做得很好。

丰超
2023-03-14

基本上,你必须从你的项目和Pod项目中排除模拟器架构的arm64,

>

>

  • 如果您使用的是自定义XCConfig文件,您可以简单地添加这一行以排除模拟器架构。

    EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64
    

    然后

    在所有Cocoa Pod供应商在其Podspec中添加以下内容之前,您必须对Pod项目执行相同的操作。

    s.pod_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
    s.user_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
    

    您可以在Pod项目的构建设置中手动添加排除架构,但当您使用pod install时,它将被覆盖。

    取而代之的是,您可以在Podfile中添加此片段。每次运行pod install时,它都会编写必要的构建设置。

    post_install do |installer|
      installer.pods_project.build_configurations.each do |config|
        config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
      end
    end
    

  •  类似资料:
    • 我试图得到一个大(和工作在Xcode11!)在Xcode 12(beta 5)中构建项目,为iOS 14做准备。代码库以前是Objective-C,但现在它同时包含Objective-C和Swift,并使用Objective-C和/或Swift的POD。 我已经推出了支持Xcode12的CocoaPods新beta版(目前是1.10.0.beta2)。 吊舱安装成功。当我进行构建时,我在pod框架

    • 在ffmpeg/classes/lib/libavcodec.a(aacencdsp.o)中,为iOS模拟器构建,但链接到为独立构建的对象文件中,文件'ffmpeg/classes/lib/libavcodec.a'用于体系结构x86_64。 我的库文件libavcodec.a支持x86_64、i386、arm64、armv7、arm7等。 我在中设置了下面的代码,然后在中设置了下面的代码,但没有

    • 我有一个应用程序,它可以很好地编译和运行在旧的Mac电脑上,在物理设备上使用Intel处理器&iOS模拟器。 同样的应用程序也可以在苹果最新的M1处理器的Mac上进行编译,并且在iPhone实体设备上运行良好,但是,它拒绝为iOS模拟器进行编译。 没有模拟器的支持,调试周转的时间会变得很长,所以我正在尝试解决这个问题。更不用说Xcode预览功能也不起作用了,这很烦人。 我在没有做任何更改(但从In

    • 展开: 对于某些模拟器,我在构建项目时会收到以下错误: ld:警告:忽略文件/users/admin/library/developer/xcode/deriveddata/myapp-ekwldvjyuxwkykbareyvvydbtero/build/products/debug-iphonesimulator/libfscalendar.a,为存档生成的文件不是所链接的体系结构(i386):

    • 问题内容: 我为util / extensions创建了一个Swift框架项目,该项目将文件编译并复制到系统上的专用位置。我希望能够将此文件包含到其他项目中(Build Phases / Link Binary with Libraries)。框架项目是Cocoa Touch Framework类型的项目(从Xcode 6.1项目模板浏览器中选择)。 但是,当我尝试编译链接框架文件的项目时,收到此

    • 知道为什么会这样吗? [更新] 通过进一步分析,我发现firebase sdk的一个头文件有如下条目 但我还是知道错误