用于iOS模拟器的Xcode构建,但链接为iOS构建的目标文件,用于架构'arm64'

我正在尝试在Xcode 12(beta 5)中构建一个大型(并且正在开发Xcode 11!)项目,为iOS14做准备。代码库以前是Objective-C,但现在它包含Objective-C和Swift,并使用Objective-C和/或Swift的pod。

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

pod安装成功。当我进行构建时,我在pod框架上收到以下错误:

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

也可能是错误:

无法加载目标'arm64-appe-ios11.0'的标准库

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

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

在Xcode 12中,根据Apple的留档,该设置消失。架构设置为$(ARCHS_STANDARD)。我没有在排除的架构中设置任何内容。

这里可能发生了什么?我还没有能够用一个更简单的项目来重现这个。

550936 次浏览

我找到了解决办法!SwiftUI预览不适用于Firebase

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

不包括模拟器的体系结构

我相信我找到了答案。根据Xcode 12 beta 6发行说明:

"生成设置编辑器不再包含有效架构生成设置(VALID_ARCHS),并且不鼓励使用它。相反,有一个新的排除架构生成设置(EXCLUDED_ARCHS)。如果项目包含VALID_ARCHS,则该设置将显示在生成设置编辑器的用户定义部分。(15145028)"

我能够通过手动编辑项目文件(我无法弄清楚如何使用Xcode从项目文件中删除该项目)并删除所有引用VALID_ARCHS的行来解决此问题。之后,我能够为模拟器精细构建。

Xcode 12中已删除有效架构构建设置。如果您在此构建设置中有值,则它们会导致问题,需要删除。

我能够清除VALID_ARCHS构建设置,方法是将其添加回用户定义的构建设置(没有值),运行项目(失败),然后删除VALID_ARCHS构建设置。之后,我就可以在模拟器上运行了。

我的架构构建设置是标准架构

您可以从构建设置中的加号按钮添加用户定义的设置:

用户自定义设置

升级到Xcode 12后,我仍然能够为真实设备构建,但不能为模拟器构建。Podfile构建仅适用于真实设备。

我删除了构建设置>用户定义下的VALID_ARCHS,它起作用了!在找到这个之前,我的头撞了一会儿。

这里的问题是Xcode 11中的Valid架构。在Xcode 11中打开项目,并将项目、目标和Pods的有效架构值更改为$(ARCHS_STANDARD)。在Xcode 12中重新打开项目并构建。

我通过在“排除架构”中为项目目标和pod目标添加“arm64”来解决问题。

Xcode→目标项目构建设置排除架构→*"arm64"

Xcode→Pod Target构建设置排除架构→*"arm64"

xxx.framework podspec文件中,添加以下配置。避免使用包含arm64模拟器架构的pod包。

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

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

  • 要做到这一点,请导航到项目的构建设置,并在排斥架构中添加值arm64任何iOS模拟器SDK

    在此处输入图片描述

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

    EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64

    然后

    你必须对pod项目做同样的事情,直到所有的可可豆荚供应商都在他们的Podspec中添加了以下内容。

    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"endend

在我的案例中:

我有四个配置(+DebugQa和ReleaseQa)。Cocoapods用作依赖项管理器。

对于DebugQa,我在设备和模拟器中收集,而在ReleaseQa上仅在设备上收集。

它有助于在PodsProject中将BuildActiveArchitecture设置为“yes”。

在我的例子中,我试图在发布模式下的watch OS 7模拟器上运行,但iOS14模拟器处于调试模式。

因此,简单地将两个模拟器置于调试/发布模式为我解决了问题!

Xcode 12

删除VALID_ARCH构建设置用户自定义组工作对我来说。

在此处输入图片描述

如果您在Xcode 12中遇到模拟器而不是真实设备的问题,是的,您必须进行删除VALID_ARCHS设置,因为它不再受支持。转到“构建设置”,搜索“VALID_ARCHS”和删除用户定义的属性。在你拥有的每个目标中这样做。

不过,您可能需要在podfile的底部添加一个脚本,以使pod使用正确的架构和部署目标进行编译:

post_install do |installer|installer.pods_project.targets.each do |target|target.build_configurations.each do |config|config.build_settings.delete 'IPHONEOS_DEPLOYMENT_TARGET'config.build_settings['ONLY_ACTIVE_ARCH'] = 'NO'endendend

在我的情况下:Xcode 12

我在EXCLUDED_ARCHS上设置空值并设置ONLY_ACTIVE_ARCH Debug=YES Release=NO项目的构建设置

我把它包含在我的Podfile中:

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

它运行在我的模拟器iPhone8(iOS12)和iPhone11 Pro Max(iOS14)和我的设备iPhone7 Plus(iOS13.4)。

"Build Active Architecture Only"(ONLY_ACTIVE_ARCH)构建设置设置为yes,xcode要求arm64,因为硅MAC架构是arm64。

ARM64已被添加为Xcode12中的模拟器拱,以支持硅MAC。

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/SDKSettings.json

对我来说,以下设置有效:

构建设置排除架构

我将“arm64”添加到“任何iOS模拟器SDK”选项的发布和调试模式。

在此处输入图片描述

太长别读;

为您的库/应用程序设置“仅构建活动架构(ONLY_ACTIVE_ARCH)”为,即使是发布模式。


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

  1. Xcode 12实际上是苹果硅的垫脚石,不幸的是它还不可用(当答案写下来的时候)。但是有了这个平台,我们将获得一个基于arm64的macOS,模拟器也将在arm64架构上运行,这与目前基于英特尔的x86_64架构不同。

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

  3. xcodebuild,在Xcode 12+构建系统认为arm64作为模拟器支持苹果硅的有效架构。因此,当模拟器被选为运行目标时,它也可能尝试编译/链接你的库/应用程序与基于arm64的模拟器。因此,它向clang(++)发送一些目标标志,如<架构>---<目标>格式中的arm64-apple-ios13.0-simulator,并clang尝试构建/链接到基于arm64的模拟器,最终在基于英特尔的Mac上失败。

  4. 但是xcodebuild仅在上线构建时尝试这样做。为什么?因为,“仅构建活动架构(ONLY_ACTIVE_ARCH)”构建设置通常仅针对“发布”配置设置为“否”。这意味着xcodebuild将尝试为发布构建的选定运行目的地构建您的libs/应用程序的所有架构变体。对于模拟器运行目的地,它现在将包括x86_64arm64由于Xcode 12+中的#4也是模拟器支持的架构以支持Apple芯片。

简单地说,Xcode在尝试命令行xcodebuild(默认为发布构建,请参阅项目设置的常规选项卡)或其他方式和尝试构建运行目标支持的所有体系结构变体时将无法构建您的应用程序。因此,解决此问题的一个简单方法是在您的库/应用程序中将“Build Active Architecture Only(ONLY_ACTIVE_ARCH)”设置为,即使是在发布模式下。

在此处输入图片描述

在此处输入图片描述

如果库包含为Pods并且您可以访问.podspec,则可以简单地设置:

spec.pod_target_xcconfig={'ONLY_ACTIVE_ARCH'=>'是'}

spec.user_target_xcconfig={'ONLY_ACTIVE_ARCH'=>'是'}#不推荐

我个人不喜欢自Pod不应该污染目标项目以来的第二行,它本身可以在目标设置中被覆盖。因此,通过某种方式覆盖设置应该是消费者项目的责任。然而,这可能是必要的成功皮屑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"endendend

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

编译配置切换回调试模式或打开仅构建活动架构以同时使用调试和发布模式。

原因是您的库/框架不支持新的模拟器架构ARM64(在使用苹果硅处理器的Mac上运行)。

我在从命令行构建框架时遇到了问题。我的框架依赖于其他缺乏对基于ARM的模拟器支持的框架。在升级依赖项之前,我最终排除了对基于ARM的模拟器的支持。

在从命令行构建模拟器框架时,我需要EXCLUDED_ARCHS=arm64标志。

xcodebuild archive -project [project] -scheme [scheme] -destination "generic/platform=iOS Simulator" -archivePath "archives/[scheme]-iOS-Simulator" SKIP_INSTALL=NO BUILD_LIBRARY_FOR_DISTRIBUTION=YES EXCLUDED_ARCHS=arm64

Build Settings搜索VALID_ARCH,然后按delete。这应该适用于我的Xcode 12.0.1

VALID_ARCH构建设置

添加行“arm64”(不带引号)到路径:Xcode*→项目构建设置架构排除的架构

此外,对Pods执行相同的操作。在这两种情况下,对调试和发布字段都执行相同的操作。

或者详细…

使用Xcode 12部署到模拟器时提到的错误也是影响我的事情之一。只需右键单击我的每个项目并显示在finder中,在Atom中打开. xcodeproj,然后浏览. pbxproj并删除所有VALIDARCHS设置。这就是它为我工作的原因。

我尝试了其他一些建议(不包括arm64,仅构建活动架构),这些建议似乎让我的构建更进一步,但最终让我陷入了另一个错误。首先检查一下VALIDARCH设置可能是最好的事情。

在尝试了几乎所有问题的答案并阅读了Apple开发者论坛后,我发现只有一个解决方案适合我。

我正在构建一个在Swift应用程序中使用的通用框架。我无法在没有架构错误的情况下构建模拟器。

在我的框架项目中,我在构建阶段有一个普遍框架任务。如果这是你的情况:

  • 在构建阶段将以下内容添加到您的xcodebuild任务中:EXCLUDED_ARCHS="arm64"

接下来,您必须更改以下项目构建设置

  • 删除VALID_ARCHS用户定义设置
  • 设置ONLY_ACTIVE_ARCH***

***如果您正在开发一个框架并有一个演示应用程序,则必须在两个项目中打开此设置。

只有添加任何iOS模拟器SDKx86_64项目的构建设置VALID_ARCHS对我有用。

Xcode版本:12.1(12A7403)

在此输入图片描述

如果您的项目包含一些不支持x86_64框架。

  • 您可以将这些框架名称(xxx.framework)添加到目标构建设置排除的源文件名调试任何iOS模拟器SDK
  • 然后修改框架搜索路径以删除调试任何iOS模拟器SDK的这些框架的路径。

这两个设置可以避免Xcode在模拟器模式下构建和链接这些框架。

在此输入图片描述

在此输入图片描述

更新:2020年10月

您可以简单地将arm64设置为排除架构下的Debug > Simulator - iOS 14.O SDK

输入图片描述

为模拟器编译时出现问题:

为iOS模拟器构建,但链接为iOS构建的目标文件,用于架构arm64

Xcode 12.1, Pod 1.9.1

我的项目结构

  • 主要目标
  • 分享扩展
  • 通知服务扩展
  • 子模块,自定义框架
  • Podfile
  1. 在所有目标中添加arm64到构建设置->Exclude Architecture

    在此处输入图片描述

  2. VALID_ARCHS中删除arm64并在所有目标中添加x86_64

    在此处输入图片描述

  3. podfile中添加以下代码

    post_install do |installer|installer.pods_project.build_configurations.each do |config|config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"endend
  4. 做了pod update,删除了podfile.lock,做了pod install

  5. 做一个干净的构建。

首先,为Pod项目生成x86_64!

post_install do |installer|installer.pods_project.targets.each do |target|target.build_configurations.each do |config|config.build_settings['ARCHS'] = "arm64 x86_64"endendend

第二,VALID_ARCHS加上“x86_64”。

在此输入图片描述

我在网上尝试了很多无用的答案后发现了这个,这对我很有效。

当我将$(ARCHS_STANDARD)设置为VALID_ARCHS用于调试任何iOS模拟器SDK时,它对我有用。我还为调试设置了YESONLY_ACTIVE_ARCH

输入图片描述

我理解arm64和Xcode 12的问题,我能够通过排除iPhone模拟器的arm64架构或为发布方案设置ONLY_ACTIVE_ARCH来解决构建问题。但是,我仍然有问题使用pod repo push推送我的框架。

我发现在我的podspec中设置s.pod_target_xcconfig并没有将此设置应用于同一podspec中定义的依赖项。我可以在Cocoapods验证期间生成的虚拟应用程序项目中看到它。Cocoapods验证正在为模拟器运行发布方案,当一个或多个依赖项不排除arm64或未设置为仅构建活动架构时,这将失败。

解决方案可以是强制Cocoapods在验证项目时添加安装后脚本,或者让它构建Debug方案,因为Debug方案仅构建活动架构。

我最终使用Xcode 11来释放我的pod以通过验证。您可以从developer.apple.com下载Xcode 11,将其复制到应用程序文件夹Xcode11.app并使用sudo xcode-select --switch /Applications/Xcode11.app/Contents/Developer切换。完成后不要忘记切换回来。

我也遇到了通过迦太基安装的特定库的相同问题。对于那些使用迦太基的人来说,由于迦太基不能使用Xcode 12开箱即用,因此本文档将指导您完成适用于大多数情况的解决方法。好吧,简而言之,Carthage构建了胖框架,这意味着该框架包含所有支持架构的二进制文件。在Apple Sillicon推出之前,它都工作得很好,但是现在存在冲突,因为有重复的架构(arm64用于设备,arm64用于模拟器)。这意味着Carthage无法将架构特定框架链接到单个脂肪框架。

您可以按照这里的说明进行操作。迦太基XCODE 12

然后在配置迦太基之后。将arm64放在构建设置的“排除架构”中。输入图片描述

尝试使用模拟器运行您的项目。模拟器应该运行没有任何错误。

排除arm64后,我总是得到ARCHS[@]:未绑定变量。对我来说,唯一的解决方案是将x86_64添加到目标构建设置中,如这里所述升级到Xcode 12后的问题:ld:为iOS模拟器构建,但链接为iOS构建的dylib,架构arm64您还可以删除之前添加的排除arm64。

xcode 12.3

我通过将验证工作区设置为是解决了此问题

在此处输入图片描述

在尝试和搜索了不同的解决方案之后,我认为最安全的方法是在Podfile的末尾添加以下代码

post_install do |pi|pi.pods_project.targets.each do |t|t.build_configurations.each do |bc|bc.build_settings['ARCHS[sdk=iphonesimulator*]'] =  `uname -m`endendend

这样,您只能将iOS模拟器的编译器架构覆盖为当前cpu的架构。与其他解决方案相比,此解决方案也适用于苹果硅的计算机。

1.在所有目标中添加arm64Build settings->Exclude Architecture

Xcode ScreenShoot

2.关闭Xcode,按照以下步骤打开

  1. 在Finder中右键单击Xcode
  2. 获取信息
  3. 用罗塞塔打开

建议的答案过时/不正确。

您应该首先尝试更新CocoaPods和您的库/应用程序的依赖项,然后,如果这不起作用,请联系您正在使用的任何依赖项的供应商,看看他们是否正在进行更新,以在M1 Mac上添加对arm64模拟器切片的支持。

此处有很多答案标记为正确,建议您应该从支持的架构列表中排除arm64。这充其量只是一个非常临时的解决方法,最坏的情况下它会将此问题传播给库的其他消费者。如果您排除arm64模拟器切片,将对您在模拟器中开发的应用程序产生性能影响(这反过来会导致您在开发惊人想法时闪亮的新M1工具包的电池时间减少)。

我找到了那个

  1. 使用Rosetta(在Finder中查找Xcode>获取信息>使用Rosetta打开)
  2. 在Project和Target中,所有内容都将Build Active Architecture Only设置为YES
  3. (你可能不需要它,阅读下面的评论)并将其包含在podfile中:
post_install do |installer|installer.pods_project.targets.each do |target|target.build_configurations.each do |config|config.build_settings["ONLY_ACTIVE_ARCH"] = "YES"endendend

为我工作。

我们有Pods和SPM,它们不适用于其他答案的任何组合。我的同事都使用英特尔MacBook,一切仍然适用于他们!

请在将arm64添加到排除的架构后,不要忘记清理构建文件夹

您可以通过转到菜单>产品>清洁构建文件夹或简单地命令+Shift+K来做到这一点。

当我遇到这个问题时,我正在尝试构建xcFramework。没有任何帮助,但我设法用lipo解决了这个问题,并分享了我的脚本:

OUTPUT_DIR_PATH="${PROJECT_DIR}/XCFramework"
function archivePathSimulator {local DIR=${OUTPUT_DIR_PATH}/archives/"${1}-SIMULATOR"echo "${DIR}"}
function archivePathDevice {local DIR=${OUTPUT_DIR_PATH}/archives/"${1}-DEVICE"echo "${DIR}"}
function archive {echo "▸ Starts archiving the scheme: ${1} for destination: ${2};\n▸ Archive path: ${3}.xcarchive"xcodebuild clean archive \-project "${PROJECT_NAME}.xcodeproj" \-scheme ${1} \-configuration ${CONFIGURATION} \-destination "${2}" \-archivePath "${3}" \SKIP_INSTALL=NO \OBJROOT="${OBJROOT}/DependentBuilds" \BUILD_LIBRARY_FOR_DISTRIBUTION=YES | xcpretty}
# Builds archive for iOS simulator & devicefunction buildArchive {SCHEME=${1}
archive $SCHEME "generic/platform=iOS Simulator" $(archivePathSimulator $SCHEME)archive $SCHEME "generic/platform=iOS" $(archivePathDevice $SCHEME)}
# Creates xc frameworkfunction createXCFramework {FRAMEWORK_ARCHIVE_PATH_POSTFIX=".xcarchive/Products/Library/Frameworks"FRAMEWORK_SIMULATOR_DIR="$(archivePathSimulator $1)${FRAMEWORK_ARCHIVE_PATH_POSTFIX}"FRAMEWORK_DEVICE_DIR="$(archivePathDevice $1)${FRAMEWORK_ARCHIVE_PATH_POSTFIX}"
echo "Removing ${FRAMEWORK_SIMULATOR_DIR}/${1}.framework/${1}"
if lipo "${FRAMEWORK_SIMULATOR_DIR}/${1}.framework/${1}" -verify_arch "arm64"; thenecho "Removing arm64"lipo -remove "arm64" -output "${FRAMEWORK_SIMULATOR_DIR}/${1}.framework/${1}" "${FRAMEWORK_SIMULATOR_DIR}/${1}.framework/${1}"fi
xcodebuild -create-xcframework \-framework ${FRAMEWORK_SIMULATOR_DIR}/${1}.framework \-framework ${FRAMEWORK_DEVICE_DIR}/${1}.framework \-output ${OUTPUT_DIR_PATH}/xcframeworks/${1}.xcframework}
echo "#####################"echo "▸ Cleaning the dir: ${OUTPUT_DIR_PATH}"rm -rf $OUTPUT_DIR_PATH
DYNAMIC_FRAMEWORK="${PROJECT_NAME}"
echo "▸ Archive $DYNAMIC_FRAMEWORK"buildArchive ${DYNAMIC_FRAMEWORK}
echo "▸ Create $DYNAMIC_FRAMEWORK.xcframework"createXCFramework ${DYNAMIC_FRAMEWORK}

很容易搞定

  1. 右键单击应用程序文件夹中的xcode
  2. 获取信息
  3. 选择“使用Rosetta打开”

快跑。

Xcode获取信息

在我的情况下,它100%工作。试试这个:

我有一个临时的解决方案。

你只是跟随图像。

  • 双击架构并选择其他删除所有行

  • 添加两件事arm7s and arm7

  • 在iPhone上运行物理设备,而不是模拟器

  • 享受…

示例图像

在我的情况下,错误是由GTMAppAuth抛出的,我在我的Flutter项目中与Google登录一起使用。

解决方案:您必须转到该包并单击仅构建活动架构中的

Xcode 12,构建iOS模拟器,但链接到目标文件构建iOS,架构arm64

我也遇到了同样的问题,并试图在M1 Mac上启动React Native应用程序。请注意,我的Intel Mac在同一项目中运行良好,没有出现此错误。

对我来说解决问题的是强制Xcode通过Rosetta打开。

要做到这一点:

右键单击应用场景文件夹*中的Xcode→获取信息→选中“使用Rosetta打开”复选框。

我在模拟器/SwiftUI预览版中遇到了同样的问题,并有以下警告:

LD:警告:忽略文件Pods/…/X.xcframework/ios-arm64_armv7/X.xcframework/X,文件中缺少所需的架构x86_64忽略文件Pods/…/X.xcframework/ios-arm64_armv7/X.xcframework/X(2片)

我在项目设置中的框架搜索路径中有递归路径$(SRCROOT)。删除它后,项目构建没有错误。

在下图中,在排除架构中→在调试和发布中点击+按钮→在调试和发布中。

在此输入图片描述

在我们的例子中,它是Jenkins构建中的错误:

框架/发布xxx/Library/Developer/Xcode/DerivedData/xxx-cuytrcyjdlefmavpdonsKnoypgk/Build/Products/Debug-iphoneos/AppsFlyerLib.framework/AppsFlyerLib为iOS构建,但链接为Mac Catalyst构建的目标文件,文件'xxx/Library/Developer/Xcode/DerivedData/AppsFlyerLib.framework/AppsFlyerLib'架构arm64

我们用sudo gem update cocoapods修复了它。

在我的情况下,更新CocoaPods有帮助:

  1. 如果安装了CocoaPods,请卸载:

    sudo gem uninstall cocoapods
  2. 安装CocoaPods:

    brew install cocoapods
  3. 如果您有链接错误:

    brew link --overwrite cocoapods`
  4. 运行pod install

转到目标部分,选择每个目标并执行以下操作:

  • 设置仅构建活动架构为是
  • 添加排除架构并将其值设置为arm64(见附件)
  • 将活动方案(在项目名称旁边的工具栏上)设置为任何iOS模拟器
  • 产品详情菜单清理Build文件夹并构建。

在此处输入图片描述

隐藏在所有这些答案中的宝石

我在主项目的目标中更改了“排除架构”,但没有更改PODS项目。这是一个真正隐藏的宝石。我已经处理这个问题几周了。

在PODS PROJECT中排除arm64

Xcode 13.2.1,macosv12(Monterey),目标iOS14.0和CocoaPods 1.11.2

当包含LogRocket和/或Plaid时,我遇到了类似的问题-它们是xcframework并且在我的本地上运行良好,但它们不能构建在bitrise上。我尝试了上面的所有答案:

  • EXCLUDED_ARCHS arm64
  • 在Podfile中设置ONLY_ACTIVE_ARCHYES
  • VALIDATE_WORKSPACEYES
  • 在Podfile中设置ARCHS[sdk=iphonesimulator*]uname -m

没有一个工作。

但是通过指定目标iOS版本或删除它将起作用:

post_install do |installer|installer.pods_project.targets.each do |target|target.build_configurations.each do |config|config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '14.0'# ORconfig.build_settings.delete 'IPHONEOS_DEPLOYMENT_TARGET'endendend

我在切换到Macbook Pro M1 App Silicon后遇到了同样的错误。解决方法:

  • 删除Podfile.lock
  • 运行pod install就是这样

转到finder->应用程序->Xcode->右键单击Xcode->选择使用rosetta打开

在此处输入图片描述

Xcode版本13.2.1和macOS Monterey 12.0.1

在切换到新的M1芯片系统后,几乎每个人都面临着与旧项目和Pod相同的问题。

"在 /Users//桌面/_iOS_app/Pods/iOS /framework/(CLSInternalReport. o)中,为iOS模拟器构建,但链接为iOS构建的目标文件,文件/用户/桌面/_iOS_app/Pods/iOS /.framework/for架构arm64"

我已经找到了一个完美的解决方案。

首先,对于所有建议您的项目排除arm64的开发人员来说,是的,它会编译,但是在安装后尝试打开它时,它会显示一个弹出窗口,其中包含消息,“此应用程序的开发人员需要更新它才能使用此版本的iOS”。这是因为根据苹果“在iOS11及更高版本中,所有应用程序都使用64位架构”,如果您的项目排除arm64,它将不会在iOS11及更高版本上打开应用程序。

如果排除arm64,应用程序将不会在iOS11及更高版本中打开,并会显示此弹出窗口

<强>因此,不是选择整个项目,而是将模拟器的架构排除到arm64。

步骤:在项目文件之上,选择目标>构建设置>架构>排除的架构。现在添加选择“任何iOS模拟器SDK”并给它一个值arm64。

参考下图。

仅选择排除架构中的任何iOS模拟器SDK,而不是将其排除在整个项目中。

我不需要建立一个模拟器。

对我来说,原因是我在顶部栏中选择了iOS模拟器下的iPad,您可以选择构建目标-选择真实设备或只是Any iOS Device (arm64, armv7)修复了问题。

将此添加到我的pod文件末尾修复了错误:

post_install do |installer|installer.pods_project.targets.each do |target|target.build_configurations.each do |config|config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64 i386"endendend

截至2022年9月19日,现有的答案都不适合我。大多数答案建议从构建设置中排除arm64,完成后,它给出致命错误:找不到模块映射文件

对我有用的是使用Rosseta打开Xcode

  1. 右键单击Xcode在应用程序文件夹中
  2. 获取信息
  3. 检查使用Rosetta打开
  4. 打开Xcode
  5. 打开项目
  6. 清理构建文件夹
  7. 跑项目

通过使用Rosseta打开Xcode,不需要其他构建设置或配置。

参考文献:

请参阅此技术说明:https://developer.apple.com/documentation/technotes/tn3117-resolving-build-errors-for-apple-silicon排除模拟器的arm64应该是一个临时解决方案。