iOS 14,创建设备和模拟器库时出现lipo错误

19

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

在此之后,我们将从iphonesimulator(如果存在)复制Swift模块到已复制的框架目录中。

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个回答

39
错误的原因是Xcode 12在构建模拟器时包含了"arm64"架构的代码片段(对于 Xcode <12 只有"i386"和"x86_64"架构)。这可能是为了支持使用苹果芯片处理器的(未来)Mac上的模拟器。由于您的设备构建也包括"arm64"架构,所以`lipo`不知道您想要哪个"arm64"代码片段,并拒绝创建组合的fat二进制框架。

作为解决方法,您可以通过附加 `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的情况下支持设备和模拟器。但我尚未测试过。


1
感谢styv,这很有帮助,我也会研究XCFramework。 - Rajesh Rs
1
谢天谢地!终于在两天后找到了这个iOS 14的解决方案。 - Chirag Lukhi
如果您的项目中有任何 VALID_ARCHS 构建设置,请先将其删除。 - Siklab.ph

5

styv是正确的。

您还可以在Xcode构建设置中设置排除的架构。

输入图像描述


1

@xtyv的建议很中肯:使用XCFramework是正确的选择。

这里有一个Makefile可以生成XCFramework(根据您的情况应用替换并添加其他架构):

ARCHS = aarch64-apple-ios aarch64-apple-ios-sim
LIB = lib<library_name>.a
XCFRAMEWORK = <framework_name>-iOS.xcframework

all: $(XCFRAMEWORK)

.PHONY: $(ARCHS)
$(ARCHS): %:
    cargo build --target $@
    
$(XCFRAMEWORK): $(ARCHS)
    xcodebuild -create-xcframework  $(addprefix -library , $(foreach arch, $(ARCHS),$(wildcard target/$(arch)/debug/$(LIB)))) -headers <header_file> -output $@

你是否成功构建了一个Rust框架,可以与ObjC / Swift进行交互/通信?我很想能够在Rust中使用UIKit。 - NSMustache

1

如何为设备构建此框架

xcodebuild clean build \
  -project CodeToanBugUI.xcodeproj \
  -scheme CodeToanBugUI \
  -configuration Release \
  -sdk iphoneos \
  -derivedDataPath derived_data \
  BUILD_LIBRARY_FOR_DISTRIBUTION=YES

复制到构建文件夹

mkdir build/devices
cp -r derived_data/Build/Products/Release-iphoneos/CodeToanBugUI.framework build/devices

构建模拟器的框架

xcodebuild clean build \
  -project CodeToanBugUI.xcodeproj \
  -scheme CodeToanBugUI \
  -configuration Release \
  -sdk iphonesimulator \
  -derivedDataPath derived_data \
  BUILD_LIBRARY_FOR_DISTRIBUTION=YES EXCLUDED_ARCHS=arm64

将文件复制到模拟器的构建文件夹中

mkdir build/simulator
cp -r derived_data/Build/Products/Release-iphonesimulator/ build/simulator/

创建通用框架

mkdir build/universal
cp -r build/devices/CodeToanBugUI.framework build/universal/
lipo -create \
  build/simulator/CodeToanBugUI.framework/CodeToanBugUI \
  build/devices/CodeToanBugUI.framework/CodeToanBugUI \
  -output build/universal/CodeToanBugUI.framework/CodeToanBugUI

复制 Swift 模块

cp -r build/simulator/CodeToanBugUI.framework/Modules/CodeToanBugUI.swiftmodule/* \
  build/universal/CodeToanBugUI.framework/Modules/CodeToanBugUI.swiftmodule/

创建 xcodebuild -create-xcframework 命令

xcodebuild -create-xcframework \
  -framework build/simulator/CodeToanBugUI.framework \
  -framework build/devices/CodeToanBugUI.framework \
  -output build/CodeToanBugUI.xcframework

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接