菜鸟教程小白 发表于 2022-12-13 06:00:55

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


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

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

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

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

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

<p>感谢任何帮助。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>根据您定义的搜索目录之一,完全限定单独实现文件中的 header 路径:</p>

<p><code>#include <MONProject/Source/ExampleSentencesViewController.h></code></p>

<p>对</p>

<p><code>#include <MONSecondProject/Source/ExampleSentencesViewController.h></code></p>

<p><strong>根据澄清更新:</strong></p>

<p>理想情况下,您应该为共享代码创建一个静态库。</p>

<p>对于一个简单的情况...您<em>可以</em>通过在项目的根目录中填充一个名为 <code>ExampleSentencesViewController.h</code> 的 header 来采用直接方法,然后像这样填充它: </p>

<pre><code>/* 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) &amp;&amp; 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 &lt;MONFirstProject/ExampleSentencesViewController.h&gt;
#elif defined(MON_BUILD_MON_SECOND_PROJECT)
/* some other fully qualified path: */
#include &lt;MONSecondProject/ExampleSentencesViewController.h&gt;
#else
#error uh... which project are you trying to build?
#endif
</code></pre>

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

<pre><code>/* MONFirstProject/ExampleSentencesViewController.h&gt; */

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

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

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

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

<pre><code>- (UIViewController *)newViewControllerForMyAwesomeView {
    if (IsAppMONFirstProject) {
      return [ init...];
    }
    else if (IsAppMONSecondProject) {
      return [ init...];
    }
    else {
      assert(0 &amp;&amp; &#34;definitely break up your code, now that it is referenced by 3 or more projects&#34;);
      return 0;
    }
}
</code></pre>

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

<p>无论如何...这<em>应该</em>足以解决你的问题 - 你只需要确定较小的邪恶。</p></p>
                                   
                                                <p style="font-size: 20px;">关于iphone - XCode 如何处理带有多个目标的#importheader 语句?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/4112483/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/4112483/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: iphone - XCode 如何处理带有多个目标的#import header 语句?