为 iOS 模拟器构建,但链接框架 '****.framework' 是为 iOS 构建的

mic*_*ebo 164 xcode ios

我不能再在模拟器上运行我的应用程序了。网上建议我编辑我的project.pbxproj,但这似乎不起作用。我如何恢复在我的模拟器上运行我的项目的能力(并且仍然能够在设备上这样做)?我正在开发另一个使用许多相同框架的项目,但它在模拟器上运行。什么会导致类似的框架在一个项目中工作但在另一个项目中不起作用?

Run*_*der 502

Xcode 12.3

就我而言,我通过在 Build Settings 选项卡中将Validate Workspace设置为 Yes解决了这个问题

在此处输入图片说明

  • 毫无疑问,这是我的+1,它救了我。但老实说,你们如何解决此类问题?你的思考过程是怎样的? (98认同)
  • 有人可以解释为什么它有效吗?当我更改“验证工作空间”时,我的错误变成了警告。这是疯狂且不可预测的。也许它没有解决核心问题,但我们只是在 Xcode 中发现了另一个错误? (12认同)
  • 根本问题可能是您的工作区无效,因为您链接的是预构建的“胖”.framework,其中包含 iOS 和 iOS 模拟器切片,而不是 .xcframework。Xcode 不支持前者。在 Xcode 12.3 中,由于现在根据此条件验证框架,并且验证工作区默认设置更改为“是(错误)”(?),因此您会看到此错误。关于.xcframework,请参阅我的回答/sf/answers/4579251841/了解更多详细信息。 (7认同)
  • 它也救了我。当我将 XCode 更新到 12.3 时发生了这种情况,但这解决了它 (3认同)
  • 查看“验证工作空间”的选项,我们有“否”、“是”和“是(错误)”,将“验证工作空间”设置为“是(错误)”会出现此错误,将其设置为“是”会出现警告,将其设置为“否”会完全忽略此问题。在我看来,他们将默认值更改为“是”(错误)。 (3认同)
  • 我必须将其从“否”切换为“是”,然后再次切换回“否”才能正常工作。我不再更新 Xcode...每次我更新时,我都必须花费至少一天的时间来尝试修复我的项目,以便它们再次编译。 (2认同)

fly*_*erz 111

毫无疑问,Xcode 12.3 的修复是在目标的构建设置中设置验证工作区属性。但是,如果您在此更改后检查差异,则构建错误的原因是项目文件中缺少参数 (VALIDATE_WORKSPACE),而不是参数值。所以你不需要值为 YES。您需要将该值添加到项目设置中,并且可以将其保留为默认值 (NO)。第一次,它在 Build Settings 中显示为 NO,但这只是因为这是缺少参数的默认值。

TLDR; 在不更改项目设置的情况下,转到目标的构建设置,找到"Validate Workspace",将其设置为 YES,然后再设置回 NO

  • 是的!这是正确的,我必须将其从“否”切换到“是”,然后再次切换回“否”才能正常工作。我不再更新 Xcode...每次我更新时,我都必须花费至少一天的时间来尝试修复我的项目,以便它们再次编译。 (10认同)

Mar*_*mes 21

当我将自定义框架添加到项目中并更新 Xcode 后,我遇到了同样的问题。

解决方案:在项目中的构建设置下搜索验证工作区只需更改为yes默认设置为no

在此处输入图片说明

  • 是的,这还包括框架。当我开始作为 ios 开发者的职业生涯时,我看过你们的 YouTube 视频,我很想看你们的英文教程,因为我不懂印地语:) (2认同)

gur*_*tor 16

使用 .xcframework 而不是包含 iOS 和 iOS 模拟器切片的“胖”.framework。这也避免了在为 App Store 构建时使用构建阶段来剥离 iOS 模拟器切片的需要。

不支持通常使用 lipo 创建的“胖”框架,因为它们不能由 Xcode 直接构建(来源:开发者技术支持 Apple 开发者论坛)。.xcframework 是唯一支持的机制,可以提供支持 iOS 和 iOS 模拟器的单个框架。

此外,.xframework 是发布二进制 Swift 框架的唯一受支持方式(来源:Apple 开发者论坛上的开发者技术支持)。

在 Xcode 12.3 中,强制执行不支持“胖”框架的事实,因为 Xcode 在构建期间验证框架,这就是为什么许多项目突然开始看到构建错误的原因。


mis*_*nry 11

这里的大多数答案都是针对通用二进制文件的消费者来解决新限制的。但是,正如其他地方所指出的,是时候XCFramework为框架作者迁移到 Apple 的格式了。

如果您之前运行自定义构建脚本以使用聚合目标和 来创建通用二进制文件lipo,则可以直接迁移到生成.xcframework文件

首先,在构建设置中确保“构建分发库”( BUILD_LIBRARY_FOR_DISTRIBUTION) 设置为YES

然后,将使用的现有聚合目标构建脚本替换lipo为以下内容,这很容易仅用于展示如何制作“发布”框架:

# Universal Script

set -e

FRAMEWORK_NAME="your_framework_name"
IOS_SCHEME_NAME="your_scheme_name"

if [ -d "${SRCROOT}/build" ]; then
rm -rf "${SRCROOT}/build"
fi

SIMULATOR_ARCHIVE_PATH="${SRCROOT}/build/${FRAMEWORK_NAME}-iphonesimulator.xcarchive"
DEVICE_ARCHIVE_PATH="${SRCROOT}/build/${FRAMEWORK_NAME}-iphoneos.xcarchive"

OUTPUT_DIR="${SRCROOT}/framework_out_universal/"

# Simulator xcarchieve
xcodebuild archive \
  -scheme ${IOS_SCHEME_NAME} \
  -archivePath ${SIMULATOR_ARCHIVE_PATH} \
  -configuration Release \
  -sdk iphonesimulator \
  SKIP_INSTALL=NO

# Device xcarchieve
xcodebuild archive \
  -scheme ${IOS_SCHEME_NAME} \
  -archivePath ${DEVICE_ARCHIVE_PATH} \
  -sdk iphoneos \
  -configuration Release \
  SKIP_INSTALL=NO

# Clean up old output directory
rm -rf "${OUTPUT_DIR}"

# Create xcframwork combine of all frameworks
xcodebuild -create-xcframework \
  -framework ${SIMULATOR_ARCHIVE_PATH}/Products/Library/Frameworks/${FRAMEWORK_NAME}.framework \
  -framework ${DEVICE_ARCHIVE_PATH}/Products/Library/Frameworks/${FRAMEWORK_NAME}.framework \
  -output ${OUTPUT_DIR}/${FRAMEWORK_NAME}.xcframework

# Delete the most recent build.
if [ -d "${SRCROOT}/build" ]; then
rm -rf "${SRCROOT}/build"
fi
Run Code Online (Sandbox Code Playgroud)

您可以调整上述内容以获得不同的输出目录、不同的删除行为、支持多种配置(发布与调试),但这对我有用。

最后,作为一个时间步骤,删除your_framework_name.framework导致您在此项目中提到的错误的通用二进制文件。复制新构建的your_framework_name.xcframework并将其添加到项目中,错误应该会消失。


小智 6

可能的原因是

  1. 您使用的框架可能不是为模拟器架构(x86_64)构建的,您可以通过在此路径中转到框架文件夹(framework_name.framework --> modules --->framework_name.swiftModule-->)来检查兼容性查看 arm/i386/x86_64 支持文件
  2. 如果您更新到新的 Xcode,您使用的框架与较新的编译器版本不兼容,因此供应商需要共享最近兼容的框架,在这种情况下,您将无法在设备和模拟器上运行


Gal*_*ank 5

Xcode 12.3 充满了问题。您的选择是:

  1. 使用旧版构建系统或
  2. 降级到 12.2 不知道 Apple 如何发布这样一个有缺陷的产品

  • 执行规则不是错误 (6认同)

Kar*_*rol 1

我想您链接的框架只是为 Arm 架构构建的。您将无法在模拟器中运行它。您将需要框架的作者来构建“通用框架”。