ios Xcode继续使用旧的框架版本

q8l4jmvw  于 9个月前  发布在  iOS
关注(0)|答案(6)|浏览(121)

从我的项目开始,我使用一个自定义框架,让我们称之为“custom.framework”。但是这个框架有一个bug,现在我想使用另一个版本的“custom.framework”。
一开始,我只是简单地从我的项目中删除了“custom.framework”文件,并添加了新的。但是什么都没有改变,bug仍然存在。
经过多次尝试和几个小时后,我明白了Xcode在内存中添加了旧版本,并使用了这个版本而不是新版本。我知道这一点,因为在新版本中我添加了一个方法,当我cmd+单击我添加方法的类时,它不在那里,文件的路径不可用。
在网上搜索,我试图改变我的框架项目的一些版本参数:兼容性版本,当前库版本,框架版本。但这并没有改变任何Xcode,它仍然使用旧版本。
我还尝试将框架的项目作为子项目,并将生成的框架作为依赖项添加到我的目标中。它运行得很好,但由于框架的项目位于单独的远程git存储库中,我认为这不是一个可接受的解决方案。
所以我最后一次尝试是构建一个“custom2.framework”,强制Xcode使用真实的文件,而不是一些缓存的版本。但是,同样,它不起作用,当构建时,我得到错误,告诉我,我在custom2.framework中的所有类都是其缓存版本“custom.framework”的重复符号。
所以我的问题很简单我怎么才能最终告诉Xcode删除其缓存的旧版本,让我使用我给他的文件?我已经试图删除我的项目的derivedData,但似乎缓存的框架不存在....我太绝望了:(
编辑:这里有两个截图来说明这个问题
第一个屏幕截图是当我从项目导航器中的.framework对象打开文件时Xcode显示的路径。

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

正如您所看到的,与代码链接的框架不是项目中的框架。

6fe3ivhb

6fe3ivhb1#

在新框架中绑定似乎有问题,您的项目仍然与旧框架文件链接。2尝试删除与您的“custom.framework”相关的所有文件和文件夹,并从项目设置-->构建设置-->搜索路径中删除框架的路径
然后在项目中拖放您的“自定义.framework”文件。
对我有效,希望能解决你的问题。

axkjgtzd

axkjgtzd2#

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

50few1ms

50few1ms3#

这听起来可能很傻,但有时候重启XCode或整个机器就能解决问题。
您是否从构建阶段-->将二进制文件与库链接中删除了旧框架?

b5lpy0ml

b5lpy0ml4#

使用 Clean Build Folderoption-shift-command-K,或在按住alt/option键的同时从 Product 菜单中选择它。

piok6c0g

piok6c0g5#

首先让我们先说一些事情。构建阶段是一个由Xcode根据您的构建设置管理的命令行工具。
所以当Xcode找不到你的框架时,编译系统通常也找不到它。这迫使你采取行动,但最终可能会在混乱的Xcode中捕获一个较旧的引用。
是的,可能会发生Header Xcode指向的是正确的,但构建系统仍然在某处使用旧副本。过时的副本可以在任何地方悬挂,这取决于您之前采取的步骤。
它(Xcode)假设它所在的位置,但构建系统仍然使用另一个版本或搜索路径,只是指向错误的位置,即使它们对你可见,甚至你的框架图标在列表中可见。所以当你删除最后一个构建时,你实际上只是强制Xcode从已知参数重建,设置保持不变,列表保持不变。即使重新启动Xcode也不会改变任何东西,问题仍然存在。

Ergo:编译器说明、Xcode设置和构建系统设置与#import <NAME/Name.h>的代码不匹配

所以你至少要再检查一下这6个阶段:
1.您的框架头文件是否已在您的框架项目中发布?
1.构建设置是否真的指向正确的框架搜索路径或系统框架搜索路径?
1.你的框架在链接列表中吗?
1.您的框架是否在Embed Framework列表中?
1.您的框架是否显示在工作区/项目浏览器的框架组文件夹中?(通常是浏览器中所有其他文件下方的最后一个组文件夹)
1.我的文件夹结构是否正确?
至少1到4必须是正确的,否则它将失败。
这里随机列出了一些常见的原因

  • 框架位于源路径结构之外
  • 结构在您将其添加到项目后发生了更改
  • 您使用Workspace,其中Framework开发和最终应用程序可以并排显示,但您假设Xcode使用它来更改其搜索路径
  • 包含的构建设置会误导之前的拖放操作,最终会在“错误”的角落欺骗Xcode。在这种情况下,重新创建一个项目只是修复它的可能方法之一,但不是解决方案。
  • 将框架拖到你的Project > General中,或在Build Phases>Link Binary列表或Embed Framework列表中分离,也不会使Xcode意识到错误的构建设置。

链接工作,嵌入工作,但编译不。标题信息仍然丢失。

解决方案必须是更正您的构建设置。

如上所述,构建系统和Xcode是两个不同的东西。特别是只有设置正确的框架搜索路径才能解决这些问题,即使你设法手动踢你的派生数据。

删除派生数据?

派生数据是预编译器收集要编译的数据的地方。因此,它可以被视为所有设置被告知要做的事情的表达。擦除它当然不会更改设置,但可能会修复与以前的构建设置相关的不一致。它会擦除派生数据并从您提供的构建系统设置中重建。

正在修改链接?

另外,Linking并不等同于让Xcode知道所需的Header。Linking是为了让你的最终产品知道Symbol在运行时会在哪里调用它们,它不会改变Framework Search PathsSystem Framework Search Paths,它们与给定的一样。
但是首先使用Product > Clean Build Folder开始修复并没有错,它会强制您的构建解析所有内容,并在下一个构建中再次编译所有内容。
当问题出现时,因为文件夹结构并行或框架只是放在源目录之外**,那么你必须直接指向它们**或相对。
最有可能的是,你应该在框架搜索路径中放置一个额外的条目,如$(SRCROOT)/../Yourframeworksource/build/Debug.expression,以指向相对较高的文件夹结构。
不用说,发布版本可能需要另一个以“/Release”结尾的条目。
提示:你可以有不同的搜索路径不同的编译方案..
在你清理了链接列表、嵌入框架列表之后,这一点尤其有效,然后还检查了最后一个组文件夹“框架”的双重条目,以便在那里拖放一个新的框架引用。

如何知道前导/../是否会修复它?

当你的项目处于活动状态时,点击工作区框架组文件夹(最下面)中的框架图标,现在注意Xcode右上角的相对路径信息,如果你知道你也需要它的话。

框架搜索路径排序

当然,它也扮演了一个角色,就像#import/#include规则排序一样。记住先找到,先赢规则,因为我们经常使用#import,它的工作方式与#include不同,但会忽略第二次声明。这会导致一次错误声明的头文件在以后解析时隐藏了共享相同文件名或定义规则的正确声明

#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

字符串
因此,如果需要的话,您可以按代码和/或在构建设置中对这些条目进行排序,因为在其他声明依赖于它之前,声明什么当然很重要。

doinxwow

doinxwow6#

我也有这个问题:我把一个.framework从Project Navigator拖到了“Frameworks,Libraries,and Embedded Content”,Xcode出于某种原因把.framework移到了我的Project的根目录。当我构建一个新版本的framework时,它被构建到了我原来的位置,而Xcode在根目录下使用旧的framework。
我发现如果.framework位于组文件夹中,Xcode会将其保留在原位,如果它位于文件夹引用中,则会将其移动。
您可以通过右键单击“框架、库和嵌入式内容”中的条目来检查Xcode使用的.framework的位置。

相关问题