iOS 14,为设备和模拟器创建库时发生lipo错误

iOS 14, lipo error while creating library for both device and simulator

我们一直在使用 lipo 命令创建一个框架,当集成到其他项目中时,它可以在设备和模拟器上工作。 以下是用于生成设备和模拟器构建的构建命令

xcodebuild -target SampleSDK ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphonesimulator BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" OBJROOT="${OBJROOT}/DependentBuilds"
xcodebuild -target SampleSDK ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" OBJROOT="${OBJROOT}/DependentBuilds"

之后我们将 swift 模块从 iphonesimulator(如果存在)复制到复制的框架目录

cp -R "$BUILD_DIR/${CONFIGURATION}-iphonesimulator/${PRODUCT_NAME}/Modules/SampleSDK.swiftmodule/" "${UNIVERSAL_OUTPUTFOLDER}/${PRODUCT_NAME}/Modules/${PROJECT_NAME}.swiftmodule/"

然后是 lipo 命令

lipo -create "$BUILD_DIR/${CONFIGURATION}-iphonesimulator/${PRODUCT_NAME}/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PRODUCT_NAME}/${PROJECT_NAME}" -output "${UNIVERSAL_OUTPUTFOLDER}/${PRODUCT_NAME}/${PROJECT_NAME}"

以上命令失败并出现以下错误

fatal error: lipo: /path/to/Library/Developer/Xcode/DerivedData/Sample-bhfmlauxsdympmdjkjyvujaljevg/Build/Products/Debug-iphonesimulator/SampleSDK.framework/SampleSDK and /Users/rramshettysiddaraju/Library/Developer/Xcode/DerivedData/Sample-bhfmlauxsdympmdjkjyvujaljevg/Build/Products/Debug-iphoneos/SampleSDK.framework/SampleSDK have the same architectures (arm64) and can't be in the same fat output file

我尝试了 Whosebug 中关于添加用户定义设置 VALID_ARCHS 然后删除它的答案之一。但这没有用

错误的原因是 Xcode 12 在为模拟器构建时包含一个“arm64”架构的片段(除了通常的“i386”和“x86_64”架构对于 Xcode <12)。这可能是为了支持使用 Apple Silicon 处理器的(未来)Mac 上的模拟器。由于您的设备构建还包括“arm64”架构,lipo 不知道您想要两个“arm64”切片中的哪一个,因此拒绝创建组合的胖二进制框架。

作为解决方法,您可以通过附加 EXCLUDED_ARCHS 构建变量从模拟器构建中排除“arm64”架构:

xcodebuild -target SampleSDK ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphonesimulator BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" OBJROOT="${OBJROOT}/DependentBuilds" EXCLUDED_ARCHS="arm64"

或者,在将模拟器和设备框架合并为一个之前,使用 lipo -remove 从模拟器构建中删除“arm64”架构:

lipo -remove arm64 "$BUILD_DIR/${CONFIGURATION}-iphonesimulator/${PRODUCT_NAME}/${PROJECT_NAME}" -output "$BUILD_DIR/${CONFIGURATION}-iphonesimulator/${PRODUCT_NAME}/${PROJECT_NAME}"

在较长的 运行 中,您最好构建一个 XCFramework,它应该支持设备和模拟器而不需要使用 lipo。但是我还没有测试过这个。

styv 是对的。

您还可以在 Xcode Build Settings

中设置 Excluded Architectures