M1芯片Mac+Xcode14.0构建XCFramework时BCSymbolMaps缺失求助
Xcode 14 + M1 Mac下构建XCFramework时BCSymbolMaps缺失报错分析与修复
问题背景
使用同一bash脚本构建XCFramework已有2年,切换到M1芯片Mac并升级至Xcode14.0后出现报错:
error: the path does not point to a valid debug symbols file: /Users/*******/build/Release-iphoneos.xcarchive/BCSymbolMaps/*
已确认:
- Release-iphoneos.xcarchive目录下确实没有BCSymbolMaps文件夹
- Xcode的「debug information format」已设置为
dwarf with dsym file - 脚本在Xcode13.1环境下可正常运行
附原构建脚本:
# Build the framework for device and for simulator (using # all needed architectures). xcodebuild archive -scheme "${TARGET_NAME}" -destination="iOS" -sdk iphonesimulator SKIP_INSTALL=NO BUILD_LIBRARIES_FOR_DISTRIBUTION=YES -archivePath "${SRCROOT}/build/Release-iphonesimulator" xcodebuild archive -scheme "${TARGET_NAME}" -destination="iOS" -sdk iphoneos SKIP_INSTALL=NO BUILD_LIBRARIES_FOR_DISTRIBUTION=YES -archivePath "${SRCROOT}/build/Release-iphoneos" ls -l "${SRCROOT}/build/" # First, get all the UUID filepaths for BCSymbolMaps, because these are randomly generated and need to be individually added as the `-debug-symbols` parameter. The dSYM path is always the same so that one is manually added echo "XCFramework: Generating IPHONE BCSymbolMap paths..." IPHONE_BCSYMBOLMAP_PATHS=(${SRCROOT}/build/Release-iphoneos.xcarchive/BCSymbolMaps/*) IPHONE_BCSYMBOLMAP_COMMANDS="" for path in "${IPHONE_BCSYMBOLMAP_PATHS[@]}"; do IPHONE_BCSYMBOLMAP_COMMANDS="$IPHONE_BCSYMBOLMAP_COMMANDS -debug-symbols $path " echo $IPHONE_BCSYMBOLMAP_COMMANDS done echo "XCFramework: Generating IPHONE BCSymbolMap paths... --> Done" # XCFramework with debug symbols xcodebuild -create-xcframework -allow-internal-distribution \ -framework "${SRCROOT}/build/Release-iphoneos.xcarchive/Products/Library/Frameworks/${FRAMEWORK_NAME}.framework" \ -debug-symbols "${SRCROOT}/build/Release-iphoneos.xcarchive/dSYMs/${FRAMEWORK_NAME}.framework.dSYM" \ $IPHONE_BCSYMBOLMAP_COMMANDS \ -framework "${SRCROOT}/build/Release-iphonesimulator.xcarchive/Products/Library/Frameworks/${FRAMEWORK_NAME}.framework" \ -debug-symbols "${SRCROOT}/build/Release-iphonesimulator.xcarchive/dSYMs/${FRAMEWORK_NAME}.framework.dSYM" \ -output "${SF_RELEASE_DIR}/${FRAMEWORK_NAME}.xcframework"
报错原因分析
- Xcode 14符号生成逻辑变更:Xcode14开始,本地构建归档时默认不再生成BCSymbolMaps——这类符号文件原本主要用于App Store提交后的符号解析,本地场景下除非开启特定的符号上传/剥离配置,否则不会自动生成。
- 脚本硬编码路径缺陷:脚本直接用通配符
${SRCROOT}/build/Release-iphoneos.xcarchive/BCSymbolMaps/*获取路径,当目录不存在时,通配符不会被shell展开,而是直接作为无效路径传入xcodebuild -create-xcframework,触发报错。 - M1架构适配影响:M1芯片的Xcode对
destination="iOS"参数的解析逻辑有细微调整,间接影响了符号生成的分支流程,导致原本Xcode13中能触发的BCSymbolMaps生成逻辑不再生效。
修复方案
方案一:动态判断BCSymbolMaps目录,仅存在时添加参数
修改脚本中生成BCSymbolMap命令的部分,先判断目录是否存在,避免传入无效路径:
echo "XCFramework: Generating IPHONE BCSymbolMap paths..." IPHONE_BCSYMBOLMAP_COMMANDS="" BCSYMBOLMAP_DIR="${SRCROOT}/build/Release-iphoneos.xcarchive/BCSymbolMaps" # 先判断目录是否存在 if [ -d "$BCSYMBOLMAP_DIR" ]; then IPHONE_BCSYMBOLMAP_PATHS=("$BCSYMBOLMAP_DIR"/*) for path in "${IPHONE_BCSYMBOLMAP_PATHS[@]}"; do # 再判断是否为有效文件 if [ -f "$path" ]; then IPHONE_BCSYMBOLMAP_COMMANDS="$IPHONE_BCSYMBOLMAP_COMMANDS -debug-symbols $path " echo $IPHONE_BCSYMBOLMAP_COMMANDS fi done fi echo "XCFramework: Generating IPHONE BCSymbolMap paths... --> Done"
建议对模拟器端的BCSymbolMaps处理也做同样修改,避免后续出现同类问题。
方案二:强制开启BCSymbolMaps生成(如需保留该符号文件)
如果确实需要BCSymbolMaps,可在xcodebuild archive命令中显式添加参数,强制触发生成:
# 修改设备端的archive命令,添加强制生成参数 xcodebuild archive -scheme "${TARGET_NAME}" -destination="iOS" -sdk iphoneos \ SKIP_INSTALL=NO BUILD_LIBRARIES_FOR_DISTRIBUTION=YES \ DEBUG_INFORMATION_FORMAT=dwarf-with-dsym OTHER_CFLAGS="-fembed-bitcode" \ -archivePath "${SRCROOT}/build/Release-iphoneos"
注:BCSymbolMaps通常与Bitcode绑定,显式指定OTHER_CFLAGS="-fembed-bitcode"可确保Xcode触发相关符号生成流程。
内容的提问来源于stack exchange,提问作者Oded Regev
相关产品推荐
相关产品推荐

