使用xcodebuild生成xcframework遇Google WebRTC链接错误求解决
问题:xcodebuild构建XCFramework时Google WebRTC引发链接错误
使用xcodebuild创建XCFramework时遭遇链接错误,推测由Google WebRTC导致。以下是使用的终端脚本:
BUILD_DIR=$(dirname "$PWD")/sdk/xc PROJECT=$PWD/Example/SDK.xcworkspace TARGET_DIR=$(dirname "$PWD")/sdk/archives rm -Rf $TARGET_DIR mkdir -p $BUILD_DIR mkdir -p $TARGET_DIR ################ Build SDK xcodebuild clean -workspace $PROJECT -scheme SDK # -arch x86_64 arm64 \ MACH_O_TYPE=staticlib xcodebuild archive \ -workspace $PROJECT \ -scheme SDK \ -configuration Release \ -sdk iphonesimulator \ -destination='generic/platform=iOS Simulator' \ -archivePath $BUILD_DIR/SDK.iOS-simulator.xcarchive \ ENABLE_BITCODE=NO \ SKIP_INSTALL=NO \ BUILD_LIBRARY_FOR_DISTRIBUTION=YES | xcbeautify xcodebuild archive \ -workspace $PROJECT \ -scheme SDK \ -configuration Release \ -sdk iphoneos \ -destination='generic/platform=iOS' \ -archivePath $BUILD_DIR/SDK.iOS.xcarchive \ ENABLE_BITCODE=NO \ SKIP_INSTALL=NO \ BUILD_LIBRARY_FOR_DISTRIBUTION=YES | xcbeautify xcodebuild -create-xcframework -framework "$BUILD_DIR/SDK.iOS.xcarchive/Products/Library/Frameworks/SDK.framework" \ -framework "$BUILD_DIR/SDK.iOS-simulator.xcarchive/Products/Library/Frameworks/SDK.framework" \ -output "$TARGET_DIR/SDK.xcframework" | xcbeautify rm -Rf $BUILD_DIR
编译过程中出现如下错误:
❌ ld: building for iOS Simulator, but linking in dylib built for iOS, file '/Example/Pods/GoogleWebRTC/Frameworks/frameworks/WebRTC.framework/WebRTC' for architecture arm64 ❌ clang: error: linker command failed with exit code 1 (use -v to see invocation) ** ARCHIVE FAILED ** The following build commands failed: Ld /Users/codeing/Library/Developer/Xcode/DerivedData/SDK-bhqgqpyahwxtbjcwvmtbmnnjbqeu/Build/Intermediates.noindex/ArchiveIntermediates/SDK/IntermediateBuildFilesPath/Pods.build/Release-iphonesimulator/SDK.build/Objects-normal/arm64/Binary/SDK normal arm64 (in target 'SDK' from project 'Pods') (1 failure)
尝试添加-arch x86_64和MACH_O_TYPE=staticlib后,xcodebuild编译通过,但推送到CocoaPods时出错,需解决该问题。
解决方案
1. 修复模拟器架构冲突
错误核心是iOS Simulator的arm64架构尝试链接iOS设备版本的WebRTC库。M系列Mac的模拟器默认使用arm64架构,但GoogleWebRTC Pod中,模拟器与设备的库是分离的,编译时未正确区分。
修改模拟器归档命令,强制指定编译x86_64架构并排除arm64:
xcodebuild archive \ -workspace $PROJECT \ -scheme SDK \ -configuration Release \ -sdk iphonesimulator \ -destination='generic/platform=iOS Simulator' \ -archivePath $BUILD_DIR/SDK.iOS-simulator.xcarchive \ ENABLE_BITCODE=NO \ SKIP_INSTALL=NO \ BUILD_LIBRARY_FOR_DISTRIBUTION=YES \ ARCHS=x86_64 \ EXCLUDED_ARCHS=arm64 | xcbeautify
2. 解决静态库推送CocoaPods的问题
使用MACH_O_TYPE=staticlib转为静态库后CocoaPods报错,通常因以下原因:
- 静态XCFramework未正确配置
modulemap或umbrella header - Podspec未设置静态库相关属性
优先方案:保持动态库编译
WebRTC本身为动态库,静态链接易引发符号冲突,建议放弃MACH_O_TYPE=staticlib,先解决架构问题后用动态库构建XCFramework。
静态库适配(若必须使用)
在Podspec中添加静态库配置:
s.static_framework = true s.pod_target_xcconfig = { 'OTHER_LDFLAGS' => '-ObjC' }
同时需确保WebRTC也被静态链接,可自行构建静态版WebRTC或调整Podfile配置。
3. 验证WebRTC库架构
检查GoogleWebRTC库的架构是否正确:
lipo -info /Example/Pods/GoogleWebRTC/Frameworks/frameworks/WebRTC.framework/WebRTC
若模拟器库缺失x86_64,或设备库包含模拟器架构,执行pod install重新拉取,或指定GoogleWebRTC稳定版本。
4. 优化XCFramework构建脚本
为确保归档架构正确,修改设备归档命令,指定仅编译arm64架构:
xcodebuild archive \ -workspace $PROJECT \ -scheme SDK \ -configuration Release \ -sdk iphoneos \ -destination='generic/platform=iOS' \ -archivePath $BUILD_DIR/SDK.iOS.xcarchive \ ENABLE_BITCODE=NO \ SKIP_INSTALL=NO \ BUILD_LIBRARY_FOR_DISTRIBUTION=YES \ ARCHS=arm64 | xcbeautify
内容的提问来源于stack exchange,提问作者Musk
相关产品推荐
相关产品推荐

