当我尝试使用依赖于 LibTorch-Lite CocoaPod 的 iOS xcframework 运行应用程序时,应用程序崩溃了

问题描述 投票:0回答:1
  1. MyLibrary:我尝试安装并运行 CocoaPod,但失败了。 (https://github.com/steve-ham/MyLibrary)(包括下面的“MyFramework”)
  2. MyFramework:具有“LibTorch-Lite”CocoaPod 依赖项的 iOS 框架。 (https://github.com/steve-ham/MyFramework

当我运行“MyLibrary App”(https://github.com/steve-ham/MyLibrary)时,出现以下错误:

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 项目创建 MyFramework.xcframework (https://github.com/steve-ham/MyFramework)

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

当我使用其他 CocoaPod 项目而不是“LibTorch-Lite”执行此操作时,不会出现这样的错误。是否根本不可能将“LibTorch-Lite”包装到 .xcframework 中并像上面包装到 CocoaPod 中一样将其部署?谢谢。

ios cocoapods xcframework
1个回答
0
投票

编辑:

执行以下方法并将框架导入另一个项目后,我无法将项目(应用程序)发布到testflight。我将这个答案留在这里,以防有人可以使用它作为找到正确解决方案的垫脚石。

原答案

我能够找到一个可行的解决方案,但有一些限制:

我没有将 libTorch-Lite 的依赖项添加到我的 podspec 文件中,而是删除了对它的依赖项,并将 pods 框架嵌入到我的框架中,如下所示:

当我构建框架并将其作为 cocoapod 导入到另一个项目中时,一切都完美运行。

此方法的局限性:

通常,在 xcframework 中包含 cocoapods 的推荐方法是运行

pod init
,将 pod 添加到 podfile,运行
pod install
,然后在构建框架时,运行类似于以下内容的内容并添加所有依赖的 pod到你的 podspec 文件作为依赖项。

xcodebuild archive \
-workspace MyPackage.xcworkspace \
-scheme MyPackage \
-configuration Release \
-sdk iphoneos \
-archivePath archives/ios_devices.xcarchive \
BUILD_LIBRARY_FOR_DISTRIBUTION=YES \
SKIP_INSTALL=NO

xcodebuild archive \
-workspace MyPackage.xcworkspace \
-scheme MyPackage \
-configuration Release \
-sdk iphonesimulator \
-archivePath archives/ios_simulator.xcarchive \
BUILD_LIBRARY_FOR_DISTRIBUTION=YES \
SKIP_INSTALL=NO

rm -rf ./MyPackage.xcframework

xcodebuild -create-xcframework \
-framework ./archives/ios_devices.xcarchive/Products/Library/Frameworks/MyPackage.framework \
-framework ./archives/ios_simulator.xcarchive/Products/Library/Frameworks/MyPackage.framework \
-output ./MyPackage.xcframework

这样做(不嵌入 pods 框架并向 podspec 添加依赖项)可以让 cocopods 正确处理版本并减少发生冲突的机会。嵌入 pod 框架时,您会面临这样的风险:导入您的包的应用程序/包将具有相同的 pod 依赖项,这将导致宿主项目出现错误。

因此,如果您的框架中还依赖于常用的 pod,例如 alamofire,那么它很可能会破坏导入它的任何应用程序,假设它们也依赖于 alamofire。

© www.soinside.com 2019 - 2024. All rights reserved.