M1芯片下构建兼容iOS设备与模拟器的框架遇lipo错误求助
解决M1 Mac上lipo合并iOS框架失败的问题
问题原因
你遇到的报错是因为M1芯片的Mac为arm架构,编译模拟器版本时默认会生成arm64架构的二进制,而iOS设备版本的二进制同样包含arm64架构。lipo无法将包含相同架构的两个二进制合并,因此报错。
解决方案一:指定架构编译后用lipo合并
1. 修正编译命令并重新构建
首先纠正你之前的笔误:设备编译的sdk应为iphoneos而非iphones,同时指定明确的架构避免冲突:
- 编译iOS设备版本(仅arm64架构):
xcodebuild -project FrameworkiOS.xcodeproj -target FrameworkiOS -configuration Release -sdk iphoneos ARCHS=arm64 ONLY_ACTIVE_ARCH=NO clean build
- 编译iOS模拟器版本(仅x86_64架构):
xcodebuild -project FrameworkiOS.xcodeproj -target FrameworkiOS -configuration Release -sdk iphonesimulator ARCHS=x86_64 ONLY_ACTIVE_ARCH=NO clean build
参数说明:
ARCHS:指定要编译的架构,强制模拟器生成x86_64,与设备的arm64区分开ONLY_ACTIVE_ARCH=NO:确保编译指定的所有架构,而非仅当前Mac的活跃架构
2. 执行lipo合并命令
编译完成后,产物默认存放在build目录下的对应子文件夹中,执行以下命令合并:
# 先创建通用框架的目录 mkdir -p FrameworkiOSUniversal.framework # 复制设备版本的框架资源(头文件、Info.plist等) cp -R build/Release-iphoneos/FrameworkiOS.framework/* FrameworkiOSUniversal.framework/ # 合并二进制文件 lipo -create "build/Release-iphoneos/FrameworkiOS.framework/FrameworkiOS" "build/Release-iphonesimulator/FrameworkiOS.framework/FrameworkiOS" -output FrameworkiOSUniversal.framework/FrameworkiOS
解决方案二:使用苹果推荐的XCFramework(更可靠)
XCFramework是苹果官方支持的多平台框架格式,自动管理不同平台/架构的二进制,无需手动处理lipo冲突:
1. 分别归档设备和模拟器版本
# 归档iOS设备版本 xcodebuild archive -project FrameworkiOS.xcodeproj -target FrameworkiOS -configuration Release -sdk iphoneos -archivePath "./FrameworkiOS-iOS.xcarchive" # 归档iOS模拟器版本 xcodebuild archive -project FrameworkiOS.xcodeproj -target FrameworkiOS -configuration Release -sdk iphonesimulator -archivePath "./FrameworkiOS-Simulator.xcarchive"
2. 生成XCFramework
xcodebuild -create-xcframework \ -framework "./FrameworkiOS-iOS.xcarchive/Products/Library/Frameworks/FrameworkiOS.framework" \ -framework "./FrameworkiOS-Simulator.xcarchive/Products/Library/Frameworks/FrameworkiOS.framework" \ -output "./FrameworkiOS.xcframework"
生成的XCFramework可以直接在Xcode中导入,Xcode会根据运行环境自动选择对应的架构版本,完全避免了arm64重复的问题。
内容的提问来源于stack exchange,提问作者Semyon Tikhonenko
相关产品推荐
相关产品推荐

