首页 > 解决方案 > 如何为有条件地使用正确框架的设备和模拟器正确构建应用程序。(不是通用/胖框架)

问题描述

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

为 iOS-armv7 构建,但尝试与为 iOS-arm64 构建的文件链接 架构 armv7 的未定义符号:“OBJCCLASS$...”,引用自:ViewController.o“OBJCCLASS$...”中的 objc-class-ref,引用自: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

标签: iosobjective-cswiftcocoacarthage

解决方案


如果您可以选择将两个框架链接在一起,您可以让编译器决定。在这种情况下,您将创建一个 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并将字符串添加 iPhoneSimulatorCFBundleSupportedPlatforms数组中。

现在从文件夹中复制x86_64.swiftdoc并粘贴到 .x86_64.swiftmoduleSimulator.framework/Modules/framework_name.swiftmodule/Universal.framework/Modules/framework_name.swiftmodule/

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


推荐阅读