Xcode 继续使用旧的框架版本
Xcode keep using old framework version
从我的项目开始,我就使用自定义框架,我们称它为"custom.framework"。但是这个框架有一个错误,现在我想使用另一个版本的 "custom.framework".
起初,我只是从项目中删除了 "custom.framework" 文件并添加了新文件。但是什么都没有改变,错误仍然存在。
经过多次尝试和几个小时后,我了解到 Xcode 将旧版本添加到内存中并使用这个版本而不是新版本。我知道它是因为在新版本中我添加了一个方法,当我 cmd+单击 class 我已经添加了该方法时,它不存在并且文件路径不可用。
通过网络搜索,我尝试将一些版本参数更改为我的框架项目:兼容版本、当前库版本、框架版本。但这并没有改变 Xcode 的任何内容,它继续使用旧版本。
我还尝试将框架的项目作为子项目并将生成的框架添加为我的目标的依赖项。它运行良好,但由于框架的项目位于单独的远程 git 存储库中,我认为这不是一个可接受的解决方案。
所以我最后的尝试是构建一个 "custom2.framework",强制 Xcode 使用真实文件而不是某些缓存版本。但同样,它不起作用,在构建时我收到错误消息,告诉我 custom2.framework 中的所有 classes 都是其缓存版本 "custom.framework".
的重复符号
所以我的问题很简单:我怎样才能最终告诉 Xcode 删除它缓存的旧版本并让我使用我给他的文件?我已经尝试删除我的项目的派生数据,但似乎缓存的框架不存在....我很绝望:(
编辑:这里有 2 个屏幕截图来说明问题
第一张截图是我在项目导航器中从.framework对象打开文件时Xcode显示的路径。
第二张截图是我在代码中从cmd+click打开文件到"DCEquipmentManager"时Xcode所示的路径。
如您所见,代码链接的框架不是项目中的框架。
请尝试清除派生数据:
Window -> 组织者
在右侧你会看到项目列表。找到您的项目并点击它。在 window 的顶部,您会在派生数据前面看到删除按钮,点击它。
我想它会解决你的问题。
在新框架中绑定似乎有问题,您的项目仍然与旧框架文件链接。
尝试删除与您的“custom.framework 相关的所有文件和文件夹,并从项目设置中删除该框架的路径--> 构建设置--> 搜索路径
然后将 "custom.framework" 文件拖放到项目中。
它适用于 me.hope 它解决了您的问题。
这听起来可能很傻,但有时重新启动 XCode 或整台机器都能解决问题。
您是否从 Build Phases --> Link Binary With Libraries 中删除了旧框架?
使用清理构建文件夹:option-shift-command-K,或select它来自Product 菜单,当按住 alt/option 键时。
首先让我们先说一下。构建阶段是由 Xcode 根据您的构建设置管理的命令行工具。
因此,当 Xcode 找不到您的框架时 - 构建系统通常也找不到它。这会迫使您采取行动,但最终可能会混淆 Xcode 以获取较旧的参考资料。
是的,Header Xcode 指向的可能是正确的,但构建系统仍然在某处使用旧副本。根据您之前采取的步骤,过时的副本几乎可以随处可见。
它 (Xcode) 假设它所在的位置,但构建系统仍然使用另一个版本或搜索路径只是指向错误的位置,即使它们对您可见,甚至您的框架图标也是可见的在列表中。因此,当您删除最后一个构建时,您实际上只强制 Xcode 从已知参数重建,设置保持不变,列表保持不变。即使重新启动 Xcode 也没有任何改变,问题仍然存在。
因此:编译器说明、Xcode 设置和构建系统设置与代码告诉的 #import <NAME/Name.h>
不匹配
所以你至少要再次检查这 6 个阶段:
你的FrameworkHeader文件是否发布在你的Framework项目中?
构建设置是否真的指向正确的框架搜索路径或系统框架搜索路径?
你的框架在链接列表中吗?
你的框架在嵌入框架列表中吗?
您的框架是否出现在 Workspace/Project 浏览器的框架组文件夹中? (通常是浏览器中所有其他文件下方的最后一个组文件夹)
我的文件夹结构是否正确?
至少1到4必须正确,否则会失败
这里随机列出了常见原因
- 框架位于您的源路径结构之外
- 将结构添加到项目后发生了变化
- 您使用 Workspace 框架开发和最终应用程序可以并排出现的地方,但您假设 Xcode 使用它来更改其搜索路径
- 包含的构建设置与以前的拖放操作有误导性,最终在“错误的”角落欺骗 Xcode。在这种情况下,重新创建项目只是修复它的可能方法之一,而不是解决方案。
- 同时将框架拖入您的 项目 > 常规 或在 构建阶段 > Link 中分开二进制 列表或Embed Framework 列表不会使Xcode 意识到错误的构建设置。
Linking 有效,嵌入有效,但编译无效。 Header 信息仍然缺失。
解决方案必须是更正您的构建设置。
如上所述Build System和Xcode是两个不同的东西。特别是只有设置正确的框架搜索路径才能解决这些问题,即使您设法手动启动派生数据也是如此。
正在擦除派生数据?
派生数据是预编译器收集数据进行编译的地方。所以它可以被看作是所有设置被告知要做什么的表达。擦除它当然不会更改设置,但可能会修复与以前的构建设置相关的不一致。它会擦除派生数据并从您提供的构建系统设置中重建。
正在更正 Linking?
另外 Linking 与让 Xcode 知道所需的 Headers 不同。 Linking 是为了让您的最终产品知道符号在运行时在哪里调用它们,它不会更改 Framework Search Paths 和 System Framework Search Paths ,它们与给定的一样。
但是先用
Product > Clean Build Folder,它会强制您的构建解析所有内容并在下一个构建时再次编译所有内容。
当由于并行文件夹结构或框架只是放在源目录之外而出现问题时,您必须直接指向它们 或亲戚。
Most likely you should place one extra entry in your Framework Search Paths like $(SRCROOT)/../Yourframeworksource/build/Debug
. expression to point to relative higher folder structure.
不用说,发布版本可能需要另一个以“/Release”结尾的条目。
提示:您可以为不同的编译方案设置不同的搜索路径..
在您清理 Linking 列表、嵌入框架列表,然后检查最后一个组文件夹“Frameworks”中是否有双重条目以在其中拖放新的框架参考后,此方法特别有效。
如何知道引导 /../
是否会修复它?
当您的项目处于活动状态时,单击工作区框架组文件夹(最下方)中放置的框架图标,现在 wtch Xcode 右上角的相对路径信息,如果有一些 /../
你知道你也需要它。
框架搜索路径排序
当然有作用,就像#import/#include规则排序一样重要。
请记住 先找到先赢规则 因为我们经常使用 #import
与 #include
不同的方法,但会忽略第二次声明尝试。这导致一旦错误地声明 headers 以在稍后的解析中隐藏更正的声明,这些声明共享相同的文件名或定义规则
#ifndef xyz
#define xyz
// all your code here.
// a second read attempt would be ignored
// a second read is hidden also when you use #include then.
#endif
因此,如果需要,您可以在构建设置中按代码 and/or 对这些条目进行排序,因为在其他声明依赖它之前声明的内容当然很重要。
从我的项目开始,我就使用自定义框架,我们称它为"custom.framework"。但是这个框架有一个错误,现在我想使用另一个版本的 "custom.framework".
起初,我只是从项目中删除了 "custom.framework" 文件并添加了新文件。但是什么都没有改变,错误仍然存在。
经过多次尝试和几个小时后,我了解到 Xcode 将旧版本添加到内存中并使用这个版本而不是新版本。我知道它是因为在新版本中我添加了一个方法,当我 cmd+单击 class 我已经添加了该方法时,它不存在并且文件路径不可用。
通过网络搜索,我尝试将一些版本参数更改为我的框架项目:兼容版本、当前库版本、框架版本。但这并没有改变 Xcode 的任何内容,它继续使用旧版本。
我还尝试将框架的项目作为子项目并将生成的框架添加为我的目标的依赖项。它运行良好,但由于框架的项目位于单独的远程 git 存储库中,我认为这不是一个可接受的解决方案。
所以我最后的尝试是构建一个 "custom2.framework",强制 Xcode 使用真实文件而不是某些缓存版本。但同样,它不起作用,在构建时我收到错误消息,告诉我 custom2.framework 中的所有 classes 都是其缓存版本 "custom.framework".
的重复符号所以我的问题很简单:我怎样才能最终告诉 Xcode 删除它缓存的旧版本并让我使用我给他的文件?我已经尝试删除我的项目的派生数据,但似乎缓存的框架不存在....我很绝望:(
编辑:这里有 2 个屏幕截图来说明问题
第一张截图是我在项目导航器中从.framework对象打开文件时Xcode显示的路径。
第二张截图是我在代码中从cmd+click打开文件到"DCEquipmentManager"时Xcode所示的路径。
如您所见,代码链接的框架不是项目中的框架。
请尝试清除派生数据: Window -> 组织者 在右侧你会看到项目列表。找到您的项目并点击它。在 window 的顶部,您会在派生数据前面看到删除按钮,点击它。
我想它会解决你的问题。
在新框架中绑定似乎有问题,您的项目仍然与旧框架文件链接。 尝试删除与您的“custom.framework 相关的所有文件和文件夹,并从项目设置中删除该框架的路径--> 构建设置--> 搜索路径
然后将 "custom.framework" 文件拖放到项目中。
它适用于 me.hope 它解决了您的问题。
这听起来可能很傻,但有时重新启动 XCode 或整台机器都能解决问题。
您是否从 Build Phases --> Link Binary With Libraries 中删除了旧框架?
使用清理构建文件夹:option-shift-command-K,或select它来自Product 菜单,当按住 alt/option 键时。
首先让我们先说一下。构建阶段是由 Xcode 根据您的构建设置管理的命令行工具。
因此,当 Xcode 找不到您的框架时 - 构建系统通常也找不到它。这会迫使您采取行动,但最终可能会混淆 Xcode 以获取较旧的参考资料。
是的,Header Xcode 指向的可能是正确的,但构建系统仍然在某处使用旧副本。根据您之前采取的步骤,过时的副本几乎可以随处可见。
它 (Xcode) 假设它所在的位置,但构建系统仍然使用另一个版本或搜索路径只是指向错误的位置,即使它们对您可见,甚至您的框架图标也是可见的在列表中。因此,当您删除最后一个构建时,您实际上只强制 Xcode 从已知参数重建,设置保持不变,列表保持不变。即使重新启动 Xcode 也没有任何改变,问题仍然存在。
因此:编译器说明、Xcode 设置和构建系统设置与代码告诉的 #import <NAME/Name.h>
不匹配
所以你至少要再次检查这 6 个阶段:
你的FrameworkHeader文件是否发布在你的Framework项目中?
构建设置是否真的指向正确的框架搜索路径或系统框架搜索路径?
你的框架在链接列表中吗?
你的框架在嵌入框架列表中吗?
您的框架是否出现在 Workspace/Project 浏览器的框架组文件夹中? (通常是浏览器中所有其他文件下方的最后一个组文件夹)
我的文件夹结构是否正确?
至少1到4必须正确,否则会失败
这里随机列出了常见原因
- 框架位于您的源路径结构之外
- 将结构添加到项目后发生了变化
- 您使用 Workspace 框架开发和最终应用程序可以并排出现的地方,但您假设 Xcode 使用它来更改其搜索路径
- 包含的构建设置与以前的拖放操作有误导性,最终在“错误的”角落欺骗 Xcode。在这种情况下,重新创建项目只是修复它的可能方法之一,而不是解决方案。
- 同时将框架拖入您的 项目 > 常规 或在 构建阶段 > Link 中分开二进制 列表或Embed Framework 列表不会使Xcode 意识到错误的构建设置。
Linking 有效,嵌入有效,但编译无效。 Header 信息仍然缺失。
解决方案必须是更正您的构建设置。
如上所述Build System和Xcode是两个不同的东西。特别是只有设置正确的框架搜索路径才能解决这些问题,即使您设法手动启动派生数据也是如此。
正在擦除派生数据?
派生数据是预编译器收集数据进行编译的地方。所以它可以被看作是所有设置被告知要做什么的表达。擦除它当然不会更改设置,但可能会修复与以前的构建设置相关的不一致。它会擦除派生数据并从您提供的构建系统设置中重建。
正在更正 Linking?
另外 Linking 与让 Xcode 知道所需的 Headers 不同。 Linking 是为了让您的最终产品知道符号在运行时在哪里调用它们,它不会更改 Framework Search Paths 和 System Framework Search Paths ,它们与给定的一样。
但是先用 Product > Clean Build Folder,它会强制您的构建解析所有内容并在下一个构建时再次编译所有内容。
当由于并行文件夹结构或框架只是放在源目录之外而出现问题时,您必须直接指向它们 或亲戚。
Most likely you should place one extra entry in your Framework Search Paths like
$(SRCROOT)/../Yourframeworksource/build/Debug
. expression to point to relative higher folder structure.
不用说,发布版本可能需要另一个以“/Release”结尾的条目。
提示:您可以为不同的编译方案设置不同的搜索路径..
在您清理 Linking 列表、嵌入框架列表,然后检查最后一个组文件夹“Frameworks”中是否有双重条目以在其中拖放新的框架参考后,此方法特别有效。
如何知道引导 /../
是否会修复它?
当您的项目处于活动状态时,单击工作区框架组文件夹(最下方)中放置的框架图标,现在 wtch Xcode 右上角的相对路径信息,如果有一些 /../
你知道你也需要它。
框架搜索路径排序
当然有作用,就像#import/#include规则排序一样重要。
请记住 先找到先赢规则 因为我们经常使用 #import
与 #include
不同的方法,但会忽略第二次声明尝试。这导致一旦错误地声明 headers 以在稍后的解析中隐藏更正的声明,这些声明共享相同的文件名或定义规则
#ifndef xyz
#define xyz
// all your code here.
// a second read attempt would be ignored
// a second read is hidden also when you use #include then.
#endif
因此,如果需要,您可以在构建设置中按代码 and/or 对这些条目进行排序,因为在其他声明依赖它之前声明的内容当然很重要。