12

我们一直在使用 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

我尝试了 stackoverflow 中的一个答案,即添加用户定义的设置 VALID_ARCHS 然后将其删除。但这没有用

4

2 回答 2

30

错误的原因是 Xcode 12 在为模拟器构建时包含“arm64”架构的切片(除了 Xcode <12 的通常“i386”和“x86_64”架构)。这可能是为了支持使用 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. 但我还没有测试过这个。

于 2020-09-23T10:37:08.223 回答
0

styv 是对的。

您还可以在 Xcode Build Settings 中设置 Excluded Architectures

在此处输入图像描述

于 2022-02-23T04:50:29.087 回答