Xcode 12,针对iOS模拟器而构建,但链接到针对iOS所构建的目标文件中,用于体系结构arm64

时间:2020-08-26 23:40:26

标签: ios xcode xcode12 xcode12beta5 xcode12beta6

试图在Xcode 12(测试版5)中建立大型项目(并在Xcode 11上工作),以便为iOS 14做好准备。代码库以前是Obj-C,但现在同时包含Obj-C和Swift,并使用同样是Obj-C和/或Swift的广告连播。

我已经在Xcode 12支持下发布了新的cocoapods beta(目前是1.10.0.beta 2)。

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

“正在为iOS Simulator构建,但是在为iOS而构建的目标文件中进行链接,以用于arm64体系”

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

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

根据Apple的文档,在Xcode 12中,该设置消失了。体系结构设置为$(ARCHS_STANDARD)。在排除的体系结构中我什么都没有设置。

任何人都知道这里可能会发生什么?我还不能用一个更简单的项目来重现这一点。

46 个答案:

答案 0 :(得分:429)

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

  • 为此,请导航至项目的构建设置,然后在Any iOS Simulator SDK中添加值为arm64的{​​{1}}。

    enter image description here

OR

  • 如果您使用的是自定义Excluded Architecture文件,则只需添加此行即可排除模拟器体系结构。
XCConfig

然后

您必须对 Pod项目执行相同的操作,直到所有可可豆荚供应商都在其 Podspec 中添加了以下内容。

EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64

您可以在Pod项目的构建设置中手动添加s.pod_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' } s.user_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' } ,但是当您使用Excluded Architechure时,它将被覆盖。

为此,您可以在pod install中添加此代码段。每次您运行Podfile

时,它都会写入必要的构建设置
pod install

答案 1 :(得分:103)

TL; DR;

为您的库/应用程序(即使对于发布模式),将“仅构建Active Architecture(ONLY_ACTIVE_ARCH)”设置为


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

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

  2. Xcode通常依靠“运行目标”来构建其库/应用程序。因此,当模拟器被选择为“运行目标”时,它将为可用的模拟器体系结构构建应用程序,而当设备被选择为“运行目标”时,则将为设备支持的体系结构构建arm*

  3. 在Xcode 12+构建系统中,
  4. xcodebuild认为arm64是模拟器的有效架构。所以,当一个模拟器被选为运行目标,它可能尝试编译/对arm64基于模拟器以及链接您库/应用程序(尚未公布)。因此,它以{architecture>---格式发送clang(++)arm64-apple-ios13.0-simulator之类的-target标志,clang尝试针对基于arm64的模拟器构建/链接,该模拟器最终失败基于Intel的Mac。

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

简单地说,Xcode在尝试使用命令行xcodebuild(默认为发布版本,请参见项目设置的常规选项卡)或任何其他方式在 release < / strong>模式。因此,解决此问题的简单方法是在您的库/应用程序中将“仅构建Active Architecture(ONLY_ACTIVE_ARCH)”设置为,即使对于发布模式也是如此。

enter image description here enter image description here

如果库包含在Pod中,并且您有权访问.podspec,则只需设置以下内容即可:

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

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

我个人不喜欢自pods shouldn't pollute the target project以来的第二行,它可能会在目标设置本身中被覆盖。因此,用某种方式覆盖设置应该是用户项目的责任。但是,这可能是成功剔除podspec的必要条件。

但是,如果您无权访问.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

我担心的一件事是,当我们实际存档libs / apps时,这会产生什么影响。在归档过程中,应用程序通常采用“发布”配置,由于这将仅考虑当前运行目标的活动体系结构来创建发行版本,因此使用此方法,我们可能会丢失目标版本的armv7,armv7s等。但是,我注意到文档说(在附图中突出显示),当我们选择“ Generic iOS Device / Any Device”作为运行目标时,此设置将被忽略,因为它没有定义任何特定的体系结构。因此,我想如果我们将应用程序选择为运行目标来存档,那应该会很好。

答案 2 :(得分:67)

找到了解决方案! https://developer.apple.com/forums/thread/657913

如果您将模拟器的排除体系结构设置为arm64,它将进行编译。

excluding architectures for simulator

答案 3 :(得分:45)

“有效体系结构”构建设置已在Xcode 12中删除。如果此构建设置中包含值,则它们会引起问题,需要将其删除。

通过将其重新添加为用户定义的构建设置(无值),运行项目(失败),然后删除VALID_ARCHS构建设置,我能够“清除” VALID_ARCHS构建设置。之后,我就可以在模拟器上运行了。

“我的体系结构”构建设置为“标准体系结构”。

您可以通过“构建设置”中的加号按钮添加用户定义的设置:

User-Defined Setting

答案 4 :(得分:24)

我意识到这个问题有点老了,但建议的答案已经过时/不正确。

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

这里有很多答案标记为正确,建议您将 arm64 从支持的体系结构列表中排除。这充其量只是一个非常临时的解决方法,最坏的情况是它会将这个问题传播到您的库的其他使用者。如果您排除 arm64 Simulator slice,则会对您在 Simulator 中开发的应用程序的性能产生影响(这反过来会导致您在开发您的惊人想法时为闪亮的新 M1 套件缩短电池时间)。< /p>

答案 5 :(得分:11)

如果您在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'
     end
  end
end

答案 6 :(得分:8)

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

我在“构建设置”>“用户定义”下删除了VALID_ARCHS,它起作用了!在发现它之前要先head头。

答案 7 :(得分:7)

Xcode 12.3

我通过将Validate Workspace设置为Yes解决了这个问题

enter image description here

答案 8 :(得分:7)

我发现了

  1. 使用 Rosetta(在 Finder 中查找 Xcode > 获取信息 > 使用 Rosetta 打开)
  2. 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"
    end
  end
end

为我工作。

我们同时拥有 Pod 和 SPM,但它们不适用于其他答案的任何组合。我的同事都在使用 Intel MacBooks,一切仍然对他们有用!

答案 9 :(得分:6)

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

“构建设置”编辑器不再包含“有效体系结构”构建设置(VALID_ARCHS),不鼓励使用它。而是有一个新的“排除体系结构”构建设置(EXCLUDED_ARCHS)。如果项目包含VALID_ARCHS,则设置显示在“构建设置”编辑器的“用户定义”部分。(15145028)

我能够通过手动编辑项目文件(我不知道如何使用Xcode从项目文件中删除项目)并删除所有引用VALID_ARCHS的行来解决此问题。之后,我就可以为模拟器构建好了。

答案 10 :(得分:6)

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

内部设置>>排除的体系结构

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

enter image description here

答案 11 :(得分:6)

1.在所有目标中将 arm64 添加到 Build settings -> Exclude Architecture

Xcode ScreenShoot

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

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

答案 12 :(得分:6)

Xcode 12

User-Defined 用户定义的组下的构建设置中删除 VALID_ARCH 对我来说有用。

enter image description here

答案 13 :(得分:5)

在您的xxx.framework podspec文件中,添加以下配置 避免pod包中包含arm64相似的弓形符号

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

答案 14 :(得分:5)

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

Xcode->目标项目->构建设置->排除的体系结构>“ arm64”

Xcode-> Pod目标->构建设置->排除的体系结构>“ arm64”

答案 15 :(得分:4)

更新:2020年10月

您可以仅在排除架构下为arm64设置Debug > Simulator - iOS 14.O SDK

enter image description here

答案 16 :(得分:3)

针对Pod开发人员 在您的Podspec中添加:

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

然后在您的示例项目中 Sample project files settings

看到它运作in this project

答案 17 :(得分:3)

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

答案 18 :(得分:3)

易于修复

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

跑。

Xcode get info

答案 19 :(得分:3)

我在从命令行构建框架时遇到了问题。我的框架依赖于其他缺少对基于ARM的模拟器的支持的框架。我最终不支持基于ARM的模拟器,直到升级依赖项为止。

从CLI构建模拟器框架时,我需要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

答案 20 :(得分:3)

尝试了该线程上的几乎所有帖子并浏览了苹果开发人员论坛后,我发现只有一种解决方案对我有用。

我正在构建一个在快速应用程序中使用的通用框架。没有架构错误,我无法构建到模拟器。

在您的情况下,在我的Framework项目中,我的构建阶段中有一个Universal Framework任务

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

接下来,您必须更改以下项目EXCLUDED_ARCHS="arm64"

  • 删除Build Settings用户定义的设置
  • VALID_ARCHS设置为ONLY_ACTIVE_ARCH ***

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

答案 21 :(得分:1)

就我而言,它 100% 有效,试试这个 -

我有一个临时解决方案
你只需按照图片 double click of architecture 并选择 otherremove all lines 并添加两个内容 arm7s and arm7 并在 iPhone Not 模拟器中运行你的物理设备 并享受....

Example Image

答案 22 :(得分:1)

我也遇到了通过迦太基安装的特定库的相同问题。 对于那些正在使用Carthage的用户,由于Carthage在Xcode 12中无法立即使用,因此本文档将指导您一种适用于大多数情况的变通方法。 好吧,不久,迦太基建立了胖的框架,这意味着该框架包含所有受支持的体系结构的二进制文件。在引入Apple Sillicon之前,所有功能都可以正常工作,但是由于存在重复的架构(用于设备的arm64和用于模拟器的arm64),现在存在冲突。这意味着迦太基无法将特定于架构的框架链接到单个胖框架。

您可以按照此处的说明进行操作。 Carthage XCODE 12

然后在配置迦太基之后。将arm64放在构建设置的“排除的体系结构”中。 enter image description here

尝试使用模拟器运行项目。模拟器应该可以正常运行。

答案 23 :(得分:1)

我了解arm64和Xcode 12的问题,并且可以通过排除iPhone Simulator的arm64体系结构或为Release scheme设置ONLY_ACTIVE_ARCH来解决构建问题。但是,在使用pod repo push推送框架时,我仍然遇到问题。

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

一种解决方案可能是强制Cocoapods在验证项目时添加安装后脚本,或者让其构建Debug方案,因为Debug方案仅在构建活动体系结构。

我最终使用Xcode 11释放了pod并通过了验证。您可以从developer.apple.com下载Xcode 11,将其作为Xcode11.app复制到Applications文件夹,然后使用sudo xcode-select --switch /Applications/Xcode11.app/Contents/Developer进行切换。完成操作后,别忘了切换回去。

答案 24 :(得分:1)

仅将Any iOS Simulator SDK -> x86_64添加到Project's Build Settings -> VALID_ARCHS对我有用。

Xcode版本:12.1(12A7403)

enter image description here

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

  • 您可以将这些框架名称(xxx.framework)添加到Target -> Build Settings -> Excluded Source File Names -> Debug -> Any iOS Simulator SDK
  • 然后修改Framework Search Paths,以删除Debug -> Any iOS Simulator SDK的这些框架的路径。

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

enter image description here

enter image description here

答案 25 :(得分:1)

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

VALID_ARCH on build settings

答案 26 :(得分:1)

"Build Active Architecture Only"(ONLY_ACTIVE_ARCH)的构建设置设置为yes,xcode由于使用arm64的Silicon MAC架构而要求使用arm64。

arm64已在Xcode12中添加为模拟器拱门,以支持Silicon MAC。

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

答案 27 :(得分:1)

在我的情况下:Xcode 12

我在EXCLUDED_ARCHS上设置了空值,并设置了ONLY_ACTIVE_ARCH Debug = YES Release = NO Project's Build Setting

并且我将其包含在我的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"
        end
    end
end

它可以在我的模拟器iPhone 8(iOS 12)和iPhone 11 Pro Max(iOS 14)以及我的设备iPhone 7 Plus(iOS 13.4)上运行

答案 28 :(得分:1)

这里的问题是Xcode 11中的有效架构,在Xcode 11中打开项目,并将项目,目标和Pod的有效架构值更改为$(ARCHS_STANDARD),然后在Xcode 12中重新打开项目并进行构建

答案 29 :(得分:0)

就我而言,我试图以Relese模式在watchOS 7模拟器上运行,但iOS 14模拟器处于Debug模式。

因此,只需将两个模拟都置于Debug / Release模式即可为我解决问题!

答案 30 :(得分:0)

就我而言,更新 cocoapods 有帮助:

  1. 如果安装了 cocoapods,请卸载: sudo gem uninstall cocoapods

  2. 安装 cocoapods:brew install cocoapods

  3. 如果您有链接错误:brew link --overwrite cocoapods

  4. 运行pod install

答案 31 :(得分:0)

在我们的例子中,这是 Jenkins 构建中的一个错误:

<块引用>

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

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

答案 32 :(得分:0)

在排除架构中的上图中 -> 在调试和发布中点击 + 按钮 -> 在调试和发布中

Click here to see image

答案 33 :(得分:0)

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

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

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

答案 34 :(得分:0)

我遇到了同样的问题,并试图在 Mac M1 上启动 React Native 应用程序。请注意,我的具有相同项目的 Intel Mac 运行良好,没有出现此错误。 对我来说解决问题的是强制 Xcode 通过 Rosetta 打开。

要实现这一点: 右键单击应用程序文件夹中的 Xcode > 获取信息 > 选中“使用 Rosetta 打开”复选框。

答案 35 :(得分:0)

就我而言,错误是由 GTMAppAuth 抛出的,我在 Flutter 项目中使用 Google 登录。

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

Xcode 12, building for iOS Simulator, but linking in object file built for iOS, for architecture arm64

答案 36 :(得分:0)

就我而言:

我有4种配置(+ DebugQa和ReleaseQa) Cocoapods用作依赖管理器

对于Debug,我聚集在设备和模拟器上,并且仅在设备上的qa上聚集。

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

答案 37 :(得分:0)

遇到这个问题时,我正在尝试构建 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 & device
function buildArchive {
  SCHEME=${1}

  archive $SCHEME "generic/platform=iOS Simulator" $(archivePathSimulator $SCHEME)
  archive $SCHEME "generic/platform=iOS" $(archivePathDevice $SCHEME)
}

# Creates xc framework
function 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"; then
      echo "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}

答案 38 :(得分:0)

分享对我有用的解决方案,这可能会对某人有所帮助

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

针对iOS Simulator进行构建,但链接至针对iOS ARM64架构而构建的目标文件中

XCODE 12.1, POD 1.9.1

我的项目结构

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

enter image description here

  1. arm64中删除了VALID_ARCHS,并在所有目标中添加了x86_64

enter image description here

  1. podfile

    中添加以下代码
    post_install do |installer|
        installer.pods_project.build_configurations.each do |config|
        config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
     end
    end
    
  2. pod update,已删除podfile.lock并已pod install

  3. 进行干净的构建。

答案 39 :(得分:0)

将“构建配置”切换回“调试”模式,或仅针对“调试”和“发布”模式启用“构建活动体系结构”。 原因是您的库/框架不支持新的模拟器架构ARM64(在具有Apple Silicon处理器的Mac上运行)

答案 40 :(得分:0)

排除arm64之后,我总是得到ARCHS [@]:未绑定变量。对我来说,唯一的解决方案是将x86_64添加到目标构建设置,如此处所述Problems after upgrading to Xcode 12:ld: building for iOS Simulator, but linking in dylib built for iOS, architecture arm64。您还可以删除之前添加的exclude arm64。

答案 41 :(得分:0)

将“ arm64”行(不带引号)添加到路径:Xcode->项目->构建设置->体系结构->排除的体系结构 另外,对Pod执行相同的操作。在这两种情况下,调试和发布字段都是如此。

或详细...

在使用Xcode 12部署到模拟器时,这里提到的错误也是影响我的事情之一。只需右键单击每个项目并在finder中显示,在Atom中打开.xcodeproj,然后遍历.pbxproj并删除所有VALIDARCHS设置。这就是它为我工作的原因。 尝试了其他一些建议(不包括arm64,仅构建活动架构),这似乎使我的构建更进一步,但最终使我陷入另一个错误。最好先检查一下VALIDARCH设置,然后检查。

答案 42 :(得分:0)

在线尝试了很多无用的答案之后。这对我有用。

首先,为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"
        end
    end
end

第二,为VALID_ARCHS添加“ x86_64”

enter image description here

答案 43 :(得分:-1)

这似乎是 M1 和可可豆荚的问题。排除 arm64 对我有用,但它导致了其他问题(即没有这样的模块 X)。这对我有用,而且您不需要从每个构建中排除 arm64。

在 Rosetta 中打开终端

为此,在 Finder 中右键单击终端 --> 获取信息 --> 在 Rosetta 中选中打开

安装 ffi

sudo arch -x86_64 gem install ffi

重新安装依赖

arch -x86_64 pod install

您可以立即禁用 Rosetta,它仍然可以工作。

确保 当您尝试再次构建您的项目时,您没有排除 arm64,它会导致同样的问题。它应该从那里工作。 这也仅适用于系统版本的 Ruby,它不适用于可可豆荚的 Ruby 2.7。

答案 44 :(得分:-1)

当我将$(ARCHS_STANDARD)的{​​{1}}设置为“任何iOS模拟器SDK的调试”时,它为我工作。 另外,我将VALID_ARCHS设置为YES进行调试。

enter image description here

答案 45 :(得分:-3)

要使其适用于Calabash自动化测试

有一个拉出请求可以解决xcode 12无法与瓢虫一起使用的问题 https://github.com/calabash/run_loop/pull/757

一个临时解决方案是使用此WIP分支,尽管因为它是PR草案,所以不一定要使用它。希望将来对Xcode 12支持Calabash。

更改您的Gemfile

gem "run_loop"

gem 'run_loop', git: 'https://github.com/calabash/run_loop.git', branch: 'xcode_14_support'