gpt4 book ai didi

iphone - XCode 如何处理多个目标中的#import header 语句?

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:19:39 25 4
gpt4 key购买 nike

我有一个包含 2 个目标的 XCode 项目(两者都是 iPhone 应用程序共享 95% 的相同代码)。但是,一个模块不是“可共享的”;实现方式差异太大。

我的解决方案(不起作用)是在我的项目目录中的 Classes/ 文件夹中添加 2 个子目录 - 每个目标一个。在每个目录中,我都放置了一个名为 ExampleSentencesViewController 的 View Controller 类。当然,每个文件都只编译为一个目标的一部分——我正在寻找一种“自动切换”来根据目标使用哪个实现。

在每个目标的设置中,我将每个目录添加到“标题搜索路径”设置(每个目标的每个路径)。

奇怪的是,它只针对原始目标进行编译。我后来添加的目标不会编译,声称我已经两次包含相同的 header (公平地说,有两个文件)。如何让 XCode 忘记原始 header ?

我已经尝试从我的项目中删除 .h 文件,但这似乎没有帮助。

感谢任何帮助。

最佳答案

根据您定义的搜索目录之一,在单独的实现文件中完全限定 header 路径:

#include <MONProject/Source/ExampleSentencesViewController.h>

对比

#include <MONSecondProject/Source/ExampleSentencesViewController.h>

根据澄清更新:

理想情况下,您将为共享代码创建一个静态库。

对于一个简单的案例...您可以通过在项目的根目录中填充一个名为ExampleSentencesViewController.h 的 header 来采用直接方法。 ,并像这样填充它:

/* 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

或者您可以只使用这些定义有条件地启用/禁用具有重复名称的类的接口(interface)和实现(然后将它们都包含在项目的声明中:

/* MONFirstProject/ExampleSentencesViewController.h> */

#if defined(MON_BUILD_MON_FIRST_PROJECT)
@interface ExampleSentencesViewController : NSViewController
/* ... */
@end
#endif

...但这将需要在您的分发中包含两个 header (如果适用)。

包含的一些更精细的细节可能会有所不同,具体取决于您声明搜索路径的方式(例如,它们是否递归?)以及您是否在 xcodeproj 中使用复制 header 构建阶段。如果您在包含指令、发现选项、预处理器声明(条件编译/可见性)和/或构建配置方面过于放松,那么维护共享代码的两个项目可能会变得困惑,所以...这就是为什么我推荐共享库的原因位。这种有条件的东西(在前面的两个例子中)很容易出错并且不能很好地发展或扩展。这样做也是混淆开发工具包中其他工具的好方法。

事实上,我更喜欢这个而不是预处理器(假设您能够分发这两个类):

- (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;
}
}

如果您只是维护同一个标题的两个版本,那么做法就会大不相同。

无论如何......这应该足以解决你的问题的想法 - 你只需要确定较小的邪恶。

关于iphone - XCode 如何处理多个目标中的#import header 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4112483/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com