根据您定义的搜索目录之一,完全限定单独实施文件中的标头路径:
#include <MONProject/Source/ExampleSentencesViewController.h>
对
#include <MONSecondProject/Source/ExampleSentencesViewController.h>
根据澄清更新:
理想情况下,您应该为共享代码创建一个静态库。
对于一个简单的案例...您可以通过在项目的根目录中填充一个名为 ExampleSentencesViewController.h 的标题并像这样填充它来采用直接方法:
/* you must define either MON_BUILD_MON_FIRST_PROJECT or MON_BUILD_MON_SECOND_PROJECT at the target level */
#if (defined(MON_BUILD_MON_FIRST_PROJECT) && defined(MON_BUILD_MON_SECOND_PROJECT))
#error invalid configuration: you cannot specify both projects to be compiled
#elif defined(MON_BUILD_MON_FIRST_PROJECT)
/* some fully qualified path: */
#include <MONFirstProject/ExampleSentencesViewController.h>
#elif defined(MON_BUILD_MON_SECOND_PROJECT)
/* some other fully qualified path: */
#include <MONSecondProject/ExampleSentencesViewController.h>
#else
#error uh... which project are you trying to build?
#endif
或者您可以使用这些定义有条件地启用/禁用具有重复名称的类的接口和实现(然后将它们都包含在项目的声明中:
/* MONFirstProject/ExampleSentencesViewController.h> */
#if defined(MON_BUILD_MON_FIRST_PROJECT)
@interface ExampleSentencesViewController : NSViewController
/* ... */
@end
#endif
...但这需要在您的分发中包含两个标头(如果适用)。
包含的一些更详细的细节可能会有所不同,具体取决于您声明搜索路径的方式(例如,它们是否递归?)以及您是否在 xcodeproj 中使用复制标头构建阶段。如果您在包含指令、发现选项、预处理器声明(条件编译/可见性)和/或构建配置方面过于放松,那么维护共享代码的两个项目可能会变得混乱......这就是为什么我推荐一个共享库的原因位。这种有条件的东西(在前面的两个例子中)很容易出错,并且不能很好地发展或扩展。这样做也是混淆开发工具包中其他工具的好方法。
事实上,我更喜欢这个而不是预处理器(假设你能够分发这两个类):
- (UIViewController *)newViewControllerForMyAwesomeView {
if (IsAppMONFirstProject) {
return [[MONFirstProjectViewController alloc] init...];
}
else if (IsAppMONSecondProject) {
return [[MONSecondProjectViewController alloc] init...];
}
else {
assert(0 && "definitely break up your code, now that it is referenced by 3 or more projects");
return 0;
}
}
如果您只是维护同一个标题的两个版本,那么做法会大不相同。
无论如何...这应该足以解决您的问题 - 您只需要确定较小的邪恶。