依赖LibTorch-Lite的iOS xcframework致App崩溃,求技术解决方案
将依赖LibTorch-Lite CocoaPod的iOS xcframework集成到项目后,App运行崩溃。相关项目:
- MyLibrary:集成后运行失败的CocoaPod,包含MyFramework;
- MyFramework:依赖LibTorch-Lite CocoaPod的iOS框架。
运行'MyLibrary App'时触发崩溃,错误日志:
libc++abi: terminating with uncaught exception of type torch::jit::ErrorReport: Unknown custom class type quantized.Conv2dPackedParamsBase. Please ensure it is registered.: quantized::conv1d(Tensor qx, __torch__.torch.classes.quantized.Conv2dPackedParamsBase packed_weight, float output_scale, int output_zero_point) -> Tensor ~~~~~~~~~~~~~~~~~~~~~~ <--- HERE terminating with uncaught exception of type torch::jit::ErrorReport: Unknown custom class type quantized.Conv2dPackedParamsBase. Please ensure it is registered.: quantized::conv1d(Tensor qx, __torch__.torch.classes.quantized.Conv2dPackedParamsBase packed_weight, float output_scale, int output_zero_point) -> Tensor ~~~~~~~~~~~~~~~~~~~~~~ <--- HERE
生成MyFramework.xcframework的命令:
xcodebuild archive -workspace MyFramework.xcworkspace \ -scheme MyFramework \ -sdk iphoneos \ -archivePath "./MyFramework.xcarchive" \ BUILD_LIBRARY_FOR_DISTRIBUTION=YES \ SKIP_INSTALL=NO xcodebuild archive -workspace MyFramework.xcworkspace \ -scheme MyFramework \ -sdk iphonesimulator \ -archivePath "./MyFramework_sim.xcarchive" \ BUILD_LIBRARY_FOR_DISTRIBUTION=YES \ SKIP_INSTALL=NO \ EXCLUDED_ARCHS=arm64 xcodebuild -create-xcframework \ -framework "MyFramework.xcarchive/Products/Library/Frameworks/MyFramework.framework" \ -framework "MyFramework_sim.xcarchive/Products/Library/Frameworks/MyFramework.framework" \ -output MyFramework.xcframework
其他无LibTorch-Lite依赖的CocoaPod项目无此问题,仅依赖LibTorch-Lite时触发崩溃。请问:是否存在根本限制导致无法将LibTorch-Lite打包进xcframework并在MyLibrary项目中正常运行?
错误根源
这个崩溃并非LibTorch-Lite无法打包进xcframework的根本限制,而是LibTorch-Lite的自定义类注册逻辑在静态链接/框架嵌套场景下未被正确触发导致的。
quantized.Conv2dPackedParamsBase是LibTorch-Lite中用于量化卷积的自定义类,需要在运行时通过Torch的注册机制完成初始化。当你将MyFramework打包为xcframework并作为依赖嵌入MyLibrary时,LibTorch-Lite的初始化代码可能因为以下原因未被执行:
- 静态链接时,编译器的Dead Code Stripping优化会移除未被直接引用的初始化代码;
- 框架嵌套层级(MyLibrary → MyFramework → LibTorch-Lite)导致LibTorch的自动初始化逻辑未被触发。
修复步骤
1. 强制触发LibTorch-Lite的初始化
在MyFramework的启动代码(比如框架的头文件或初始化方法中),显式调用LibTorch的初始化函数,确保自定义类被注册:
// 在MyFramework的初始化逻辑中添加 #include <torch/script.h> void initializeLibTorch() { // 触发LibTorch的全局初始化,注册所有自定义类 torch::jit::getCustomClassManager(); }
在MyFramework被加载时调用这个函数,比如在+load方法中:
@implementation MyFramework + (void)load { initializeLibTorch(); } @end
2. 调整打包配置,避免Dead Code Stripping
在MyFramework的Xcode项目中,关闭Dead Code Stripping选项:
- 进入项目Build Settings
- 搜索
Dead Code Stripping,设置为NO - 同时确保
Link Time Optimization设置为NO(Release模式下可能默认开启,会影响代码保留)
3. 验证xcframework的依赖嵌入方式
确认MyFramework的xcframework正确包含了LibTorch-Lite的二进制文件:
- 检查MyFramework.xcframework下各平台的framework目录,确认
LibTorchLite.framework已被正确嵌入 - 在MyLibrary的Podspec中,确保MyFramework的依赖被正确声明,且LibTorch-Lite的传递依赖能被CocoaPods正确解析
4. 调整CocoaPods依赖声明
在MyFramework的Podspec中,明确声明LibTorch-Lite的依赖,确保依赖能被正确传递到MyLibrary:
Pod::Spec.new do |s| s.name = 'MyFramework' # ...其他配置 s.dependency 'LibTorch-Lite' end
同时在MyLibrary的Podspec中,正确引用MyFramework并显式声明传递依赖:
Pod::Spec.new do |s| s.name = 'MyLibrary' # ...其他配置 s.vendored_frameworks = 'MyFramework.xcframework' s.dependency 'LibTorch-Lite' # 显式声明传递依赖,避免CocoaPods遗漏 end
结论
不存在将LibTorch-Lite打包进xcframework并在嵌套CocoaPod项目中运行的根本限制,问题出在初始化逻辑未被触发或依赖传递配置错误。按照上述步骤调整后,即可解决崩溃问题。
内容的提问来源于stack exchange,提问作者Steve Ham

