我有一个情况,我有一个XCode项目,我有另一个项目与它共享大部分代码,但有一些小的差异。所以在项目中,大多数文件只是对原始项目中文件的引用,以及我需要做出改变的任何地方,我复制文件并更改副本。这很有用,因为对于共享的文件,在一个项目中进行的任何更改都将自动反映在另一个项目中。这在大多数情况下都运行良好。
现在我遇到了一个问题,我需要对包含在很多文件中的头文件进行更改。将此文件命名为“shared.h”。所以我做了我之前做的同样的事情,删除引用并复制文件并更改它。
但现在的问题是,当我编译时,我从包含此标头的文件中获得了数百个“重复的接口声明”错误。我完全理解为什么,但我想不出办法解决它。
原因是假设您有一个包含原始项目和新项目的标题的文件。在引用原始项目的文件中,当您执行#import "shared.h"
时,它们将从原始项目的目录中导入文件;在复制到新项目的文件中,当您执行#import "shared.h"
时,它们将从新项目的目录中导入该文件。因此,标头中定义的类将被导入两个不同的文件两次,因此您将获得重复的接口定义。 Objective-C的#import
将包含每个文件一次,但由于这些是两个不同的文件,它仍将包含它们。
我认为我项目中实际列出的标题将优先于所有其他标题(至少我希望它能够这样做),但似乎将标题放入项目实际上不会影响代码的构建所有。所以现在我迷路了。
此时我能想到的唯一解决方案是复制原始项目中的所有代码并将其移除,以完全分离项目。但那太可怕了。
答案 0 :(得分:1)
嗯,我实际上认为这更像是项目管理的问题。我认为像这样的另一个项目的代码链接听起来非常脆弱。即如果项目A是原始项目而项目B链接其中一些代码,项目A的更改可能会破坏项目B,而项目B无法限制或控制这些更改的影响。
我会考虑将第一个项目编译为静态库或框架并为其提供版本号。然后第二个项目可以导入库。不应通过有效地操纵类路径来处理覆盖。我已经看到用Java完成了它,它始终是处理坏代码的绝对最后手段。相反,你应该利用Objective C的能力 - 继承,类别等来添加或扩展功能。
如果您对第一个项目(即/v0.0.1/headers)进行了版本控制,那么项目B可以继续使用A的v0.0.1,直到您阅读升级到v0.0.2。然后,您可以重新导入A的静态库,更新构建路径或在要编码的新版本中指向B的任何内容。
总之,我根本不会推荐您的项目管理技术,并强烈建议您重新考虑它。