将含C++/OC/Swift的FitSDK Swift Package转为XCFramework遇问题求助
解决Garmin FitSDK适配M1/2模拟器XCFramework的问题
问题1:非模块化头文件错误修复
用简单modulemap(module FitSDK { export * })出现Include of non-modular header inside framework module错误,是因为该配置没正确识别框架头文件结构,得用带umbrella header的modulemap,同时保证路径和头文件完整性:
- 先确认XCFramework的
Headers目录下有完整的FitSDK头文件,包括FitSDK.h和所有依赖子头文件 - 把modulemap换成框架格式,并且必须放在XCFramework的
Modules目录下:
framework module FitSDK { umbrella header "FitSDK.h" export * module * { export * } }
- 检查
FitSDK.h是否导入了所有必要子头文件,比如:
#import "fit_crc.h" #import "fit_mesg.h" // 其他相关头文件
问题2:arm64架构符号未定义修复
出现Undefined symbols for architecture arm64,说明生成XCFramework时arm64模拟器架构的二进制没正确编译或合并,按以下步骤排查:
- 重新编译FitSDK的arm64模拟器版本:
- 编译时明确指定架构为
arm64,目标平台选iOS模拟器 - 用命令验证编译产物的架构:
输出必须包含lipo -info /path/to/FitSDK.framework/FitSDKarm64(模拟器)和x86_64
- 编译时明确指定架构为
- 合并架构时别遗漏arm64模拟器二进制:
- 用
lipo合并真机arm64、模拟器arm64/x86_64,要写全所有二进制路径:lipo -create /path/to/sim-arm64/FitSDK /path/to/sim-x86_64/FitSDK /path/to/device-arm64/FitSDK -output /path/universal/FitSDK
- 用
- 检查XCFramework结构:
- 内部应有
ios-arm64、ios-arm64_x86_64-simulator两个目录,每个目录下的framework都要有对应架构的二进制和完整头文件
- 内部应有
- 验证符号是否存在:
- 用
nm命令检查arm64架构下的缺失符号:
要是输出为空,说明该架构二进制确实没包含这些符号,得重新编译arm64模拟器版本nm -arch arm64 /path/to/FitSDK.framework/FitSDK | grep _FitCRC_Calc16
- 用
额外注意
- 修改
Package.swift时,确保平台配置包含iOS 12,且XCFramework路径正确:platforms: [.iOS(.v12)], products: [ .library( name: "FitSDK", targets: ["FitSDK"] ), ], targets: [ .binaryTarget( name: "FitSDK", path: "./FitSDK.xcframework" ), ] - 清理项目缓存:执行
File > Packages > Reset Package Caches后再重新构建
内容的提问来源于stack exchange,提问作者trusk
相关产品推荐
相关产品推荐

