【问题标题】:how to correctly build an app for device and simulator that conditionally uses the correct framework. (not a universal/fat framework)如何为有条件地使用正确框架的设备和模拟器正确构建应用程序。 (不是通用/胖框架)
【发布时间】:2021-04-11 18:33:58
【问题描述】:

已经获得了设备和模拟器的单独框架,我想集成这些框架以实现所需的功能。 我已将模拟器框架包含在我的迦太基框架项目中。当我编译我的框架时,我收到以下错误

为 iOS-armv7 构建,但尝试链接为 iOS-arm64 构建的文件 架构 armv7 的未定义符号: “OBJCCLASS$...”,引用自: ViewController.o 中的 objc-class-ref “OBJCCLASS$...”,引用自: DepedencyInjector.o 中的 objc-class-ref ViewController.o 中的 objc-class-ref ld:未找到架构 armv7 的符号 clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)

参考: https://developer.apple.com/forums/thread/66978 https://developer.apple.com/forums/thread/66978?answerId=215100022#215100022

【问题讨论】:

    标签: ios objective-c swift cocoa carthage


    【解决方案1】:

    您可以按如下方式构建 XCFramework(从命令行)。

    xcodebuild \
        -create-xcframework \
        -framework  "<<path to simulator xcarchive>>/Products/Library/Frameworks/SomeFramework.framework" \
        -framework  "<<path to device xcarchive>>/Products/Library/Frameworks/SomeFramework.framework" \
        -output     "CombinedFramework.xcframework"
    

    您可以为此添加更多内容并设置各种路径和输出。

    不确定这是否有帮助,因为您不是在寻找通用框架并且不确定如何对它进行分类...

    【讨论】:

    • 此命令出现以下错误:无法读取 '/Users/pravir.ahuja/Desktop/frameworkFolder/iOSSDK-device.framework /iOSSDK-device' 处的文件
    • 另外,我无权访问开发这些框架的代码仓库。我只有设备和模拟器的 .framework 文件
    • 检查该路径 - 我认为您在框架之后有一个空格。如果出现错误,请再次检查路径。这是为设备和模拟器构建框架的典型方法,但也是一个通用框架。有一些很好的答案可以带你完成 SO 和其他地方的整个过程,但通常你有来源。我认为如果您没有源代码并不重要,因为我给出的命令只是将已编译的框架组合成一个框架。
    【解决方案2】:

    如果您可以选择将两个框架链接在一起,您可以让编译器决定。在这种情况下,您将创建一个 FAT 二进制文件。这意味着:

    • 您将两个框架链接在一起
    • 创建一个 (FAT) 框架
    • 将此库链接到您在 Xcode 中的应用
    • 让编译器决定正确的架构

    创建 FAT 二进制文件的命令是:

    lipo -create ./Simulator.framework/framework_binary ./Device.framework/framework_binary -output ./Universal
    

    现在您必须复制文件夹 Device.framework 并将其命名为 Universal.framework

    将使用 lipo 创建的二进制文件复制到此文件夹中。

    然后打开文件./Universal.framework/Info.plist并将字符串iPhoneSimulator添加到CFBundleSupportedPlatforms数组中。

    现在从文件夹 Simulator.framework/Modules/framework_name.swiftmodule/ 复制 x86_64.swiftdocx86_64.swiftmodule 并将它们粘贴到 Universal.framework/Modules/framework_name.swiftmodule/.

    将创建的通用框架导入 Xcode 中的目标 Embedded Binries 部分,您应该能够编译您的项目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-06
      • 2019-01-13
      • 2018-07-01
      相关资源
      最近更新 更多