使用xcodebuild打包静态库为XCFramework后,iOS应用报“No such module”
解决XCFramework导入报错“No such module 'M'”的方案
问题场景
我们有一个混合Swift和C代码的私有iOS静态库,目标是打包成XCFramework保护代码。通过xcodebuild命令打包成功,但导入测试应用后出现构建错误:No such module 'M'。
已执行的打包脚本:
xcodebuild archive -scheme M -archivePath build/M-iphoneos.xcarchive -sdk iphoneos SKIP_INSTALL=NO xcodebuild -create-xcframework -library M/Release-iphoneos/libStatic_lib_Swift_C.a -output build/M.xcframework # 复制到测试应用目录 cp -R Build/M.xcframework ../testApp/testApp
已做尝试:
- 将
-create-xcframework的参数从-framework改为-library指定静态库文件 - 配置了Framework和测试应用Build Settings中的搜索路径与导入路径
补充说明:静态库无对外暴露的.h文件,仅通过一个公开Swift函数提供能力,该函数内部调用C代码并通过inout参数返回结果。
解决步骤
1. 确认XCFramework的模块完整性
Swift静态库要被识别为模块,必须包含module.modulemap文件。打开M.xcframework,检查平台目录(如ios-arm64)下是否存在:
- 静态库文件
libStatic_lib_Swift_C.a module.modulemap文件- Swift自动生成的头文件
M-Swift.h
如果缺少module.modulemap,手动创建并放入平台目录,内容示例:
module M { header "M-Swift.h" export * }
M-Swift.h可从归档产物的build/M-iphoneos.xcarchive/Products/Library/Headers目录获取。
2. 修正XCFramework打包命令
打包时必须同时指定静态库和对应的头文件/模块文件,正确命令格式如下:
xcodebuild -create-xcframework \ -library build/M-iphoneos.xcarchive/Products/Library/Frameworks/M.framework/M \ -headers build/M-iphoneos.xcarchive/Products/Library/Headers \ -output build/M.xcframework
如果直接用编译后的静态库文件,要确保带上包含模块文件的目录:
xcodebuild -create-xcframework \ -library M/Release-iphoneos/libStatic_lib_Swift_C.a \ -headers M/Release-iphoneos/include \ # 存放module.modulemap和M-Swift.h的目录 -output build/M.xcframework
3. 检查测试应用的导入配置
- 把
M.xcframework添加到测试应用的Frameworks, Libraries, and Embedded Content中,Embed选项设为Embed & Sign(或按需选Embed Without Signing) - 验证Build Settings里的
Framework Search Paths,建议用$(SRCROOT)拼接相对路径,比如$(SRCROOT)/testApp/M.xcframework,确保路径正确 - 确认
Import Paths配置无误,或者直接在代码中import M时Xcode能索引到模块
4. 清理缓存重新构建
- 用
Cmd+Shift+K清理测试应用的构建缓存 - 删除Xcode的
DerivedData目录(路径:~/Library/Developer/Xcode/DerivedData) - 重新执行打包脚本,再导入测试应用重新构建
内容的提问来源于stack exchange,提问作者Doug Null
相关产品推荐
相关产品推荐

