【问题标题】:Xcode keep using old framework versionXcode 继续使用旧的框架版本
【发布时间】:2015-12-26 18:58:38
【问题描述】:

从我的项目开始,我就使用了一个自定义框架,我们称之为“custom.framework”。但是这个框架有一个错误,现在我想使用另一个版本的“custom.framework”。

起初,我只是从我的项目中删除了“custom.framework”文件并添加了新文件。但是什么都没有改变,错误仍然存​​在。

经过多次尝试和数小时后,我了解到 Xcode 在内存中添加了旧版本并使用了这个而不是新版本。我知道,因为在新版本中我添加了一个方法,当我 cmd+单击我添加方法的类时,它不存在并且文件路径不可用。

通过网络搜索,我尝试将一些版本参数更改为我的框架项目:兼容版本、当前库版本、框架版本。但这并没有改变继续使用旧版本的 Xcode。

我还尝试将框架的项目作为子项目,并将生成的框架作为依赖项添加到我的目标。它运行良好,但由于框架的项目位于单独的远程 git 存储库中,我认为这不是一个可接受的解决方案。

所以我最后一次尝试是构建一个“custom2.framework”,强制 Xcode 使用真实文件而不是一些缓存版本。但同样,它不起作用,并且在构建时出现错误,告诉我我在 custom2.framework 中的所有类都是其缓存版本“custom.framework”的重复符号。

所以我的问题很简单:我怎样才能最终告诉 Xcode 删除其缓存的旧版本并让我使用我给他的文件?我已经尝试删除我的项目的derivedData,但似乎缓存的框架不存在......我很绝望:(

编辑:这里有 2 个截图来说明问题

第一个屏幕截图是我从项目导航器中的 .framework 对象打开文件时 Xcode 显示的路径。

第二张截图是当我打开文件时 Xcode 显示的路径,从 cmd+click 到代码中的“DCEquipmentManager”。

如您所见,与代码链接的框架并不是项目中的框架。

【问题讨论】:

  • 点击产品,按 alt 按钮。点击“清理构建文件夹”。
  • 它不会改变任何东西。
  • 我认为您需要确保您的新版本设置了版本控制,以便替换原始版本。见stackoverflow.com/questions/6615494/…
  • 您是否尝试过在清理产品之前进入项目->派生数据并删除派生数据?
  • @RoryMcKinnel 这就是我所做的。旧框架的 Compatibility 版本和 Curent Library 版本设置为 1,Framework 版本设置为 A。新框架为 3 和 B。

标签: ios objective-c xcode caching frameworks


【解决方案1】:

在新框架中绑定似乎有问题,您的项目仍然与旧框架文件链接。 尝试删除与您的“custom.framework”相关的所有文件和文件夹,并从项目设置中删除该框架的路径->构建设置->搜索路径

然后在项目中拖放您的“custom.framework”文件。

它对我有用。希望它能解决你的问题。

【讨论】:

  • 运行路径 searchPath 是 $(inherited) @executable_path/Frameworks
  • 好的,在“框架路径”构建设置中找到了该框架旧版本的绝对路径。我不知道为什么它是 tehre 但无论如何,现在它已经修复了,ty :p
【解决方案2】:

请尝试清除派生数据: 窗口 -> 组织者 在右侧,您将看到项目列表。找到您的项目并点击它。在窗口的顶部,您会看到派生数据前面的删除按钮,点击它。

我想它会解决你的问题。

【讨论】:

  • 正如我在原始问题及其 cmets 中所说,我已经这样做了,没有任何改变。
【解决方案3】:

这听起来可能很傻,但有时重新启动 XCode 或整台机器会修复问题。

您是否从 Build Phases --> Link Binary With Libraries 中删除了旧框架?

【讨论】:

    【解决方案4】:

    使用Clean Build Folderoption-shift-command-K,或者按住alt/从Product菜单中选择它选项键。

    【讨论】:

      【解决方案5】:

      首先让我们先说几句。 构建阶段是一个命令行工具 由 Xcode 根据您的构建设置进行管理。 因此,当 Xcode 找不到您的框架时 - 构建系统通常也找不到它。这会迫使您采取行动,但最终可能会使 Xcode 混淆以捕获较旧的引用。

      是的,可能会发生 Header Xcode(认为)是正确的,它指向某处的旧副本,根据您之前采取的步骤,实际上可以在任何地方。

      它(Xcode)假定它位于哪里,但构建系统仍然使用另一个版本或搜索路径只是指向错误的位置,即使它们对您可见,甚至您的框架图标在列表中也是可见的。因此,当您删除最后一个构建时,您实际上只是强制 Xcode 重新构建它,设置保持不变,列表保持不变,问题仍然存在。

      编译器指令和 Xcode 设置以及构建系统设置与#import <NAME/Name.h> 中的代码不匹配。

      因此,您将至少再次检查这 6 个阶段:

      1. 您的框架头文件是否在您的框架项目中发布
      2. 构建设置是否真的指向正确的框架搜索路径系统框架搜索路径
      3. 您的框架在链接列表中吗?
      4. 您的框架是否在嵌入框架列表中?
      5. 在工作区/项目浏览器的框架组文件夹中显示您的框架? (通常是浏览器中所有其他文件下方的最后一个组文件夹)
      6. 我的文件夹结构是否正确?

      至少1到4个必须是对的,否则会失败。

      这里是常见原因的随机列表

      • 框架位于您的源路径结构之外
      • 将结构添加到项目后,结构发生了变化。
      • 您使用 Workspace 的框架开发和最终应用程序可以并排出现,但您假设 Xcode 使用它来更改其搜索路径。
      • 包含的构建设置会误导以前的拖放操作,最终在“错误”的角落欺骗 Xcode。在这种情况下,重新创建项目只是修复它的一种方法,而不是解决方案。

      还可以将框架拖入您的项目>常规或在构建阶段 > 链接二进制列表或嵌入框架中分离strong> 列表确实让 Xcode 意识到错误的构建设置。
      链接有效,嵌入有效,但编译无效。仍然缺少 Header 信息。

      因此解决方案必须是更正您的构建设置。 特别是只有设置正确的框架搜索路径才能解决这些问题。

      即使您设法手动取消了派生数据。
      派生数据是预编译器收集数据进行编译的地方。所以它可以被看作是所有设置告诉要做的事情的表达。擦除它当然不会更改设置,但可能会修复与以前的构建设置相关的不一致。

      此外,链接与使 Xcode 了解所需的标头不同。链接是为了让您的最终产品知道符号在哪里调用它们。 框架搜索路径系统框架搜索路径保持不变。

      但是先开始修复并没有错 Product > Clean Build Folder,它会强制您的构建解析所有并在下一次构建时再次编译。

      当由于文件夹结构并行或框架只是放在源目录之外而出现问题时,您必须直接指向它们或相对。

      您很可能应该在您的框架搜索路径中添加一个额外的条目,例如$(SRCROOT)/../Yourframeworksource/build/Debug。表达式指向相对较高的文件夹结构。

      不用说,发布版本可能需要另一个以“/Release”结尾的条目。提示:对于不同的编译方案,你可以有不同的搜索路径..

      在您清理链接列表、嵌入框架列表并检查最后一个组文件夹“框架”以在其中拖放一个新的框架参考后,这特别好用。

      如何知道/../ 是否会修复它?
      当您的项目处于活动状态时,单击工作区框架组文件夹(最下方)中放置的框架图标,现在请注意 Xcode 右上角的相关路径信息,如果有的话/../你知道你也需要它。

      框架搜索路径的排序当然也起作用。
      先找到,先赢规则,因为我们使用 #import 忽略第二次声明尝试。
      所以你可以如果需要,对这些条目进行排序。

      【讨论】:

      • 是的,在 7 年后的一个封闭案例中回答。它可能会帮助其他从谷歌来到这里的人
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-06
      • 1970-01-01
      • 1970-01-01
      • 2022-11-12
      • 1970-01-01
      相关资源
      最近更新 更多