gpt4 book ai didi

xcode - 控制 Xcode 将包含的项目头文件

转载 作者:行者123 更新时间:2023-12-03 20:01:52 27 4
gpt4 key购买 nike

我的 Xcode 项目使用两个目标构建为同一产品的变体。两者之间的区别仅在于使用了包含库的哪个版本。对于 .c 源文件,使用目标复选框很容易将正确的版本分配给正确的目标。但是,包含头文件总是包含相同的。这对一个目标是正确的,但对另一个目标是错误的。

有没有办法控制每个目标包含哪个头文件?

这是我的项目文件层次结构(在 Xcode 中复制):

MyProject
TheirOldLib
theirLib.h
theirLib.cpp
TheirNewLib
theirLib.h
theirLib.cpp
myCode.cpp

和 myCode.cpp 做这样的事情:
#include "theirLib.h"

somecode()
{
#if OLDVERSION
theirOldLibCall(…);
#else
theirNewLibCall(…);
#endif
}

当然,我定义了 OLDVERSION一个目标,而不是另一个。

请注意 #include必须如图所示。以下两个都失败并出现文件未找到错误:
#include "TheirOldLib/theirLib.h"
#include "TheirNewLib/theirLib.h"

那么有没有办法告诉 Xcode 哪个 theirLib.h包括每个目标?

约束:
- 两个头文件同名。作为最后的手段,我可​​以重命名其中一个,但我宁愿避免这样做,因为这会导致其他平台上的主要头发拉扯。
- 必须更改 #include添加对封闭文件夹的引用也是我宁愿避免的事情,因为我需要使用条件编译指令执行两次。
- 我可以随意调整我的项目,因为我认为合适

谢谢你的帮助。

最佳答案

答案的关键部分是按照克里斯在评论中的建议使用 USE_HEADERMAP = NO 。这是详细信息。

简短配方(在 Xcode 3.2.2 中检查):

  • 为每个相关目标添加 USE_HEADERMAP = NO 的自定义build设置。方法如下:
    1.1.在“构建” Pane 中打开目标的信息面板。
    1.2.下拉窗口左下方的操作弹出菜单,选择“添加用户定义的设置”。
    1.3.在新添加的行中,将第一列(“设置”)设置为 USE_HEADERMAP ,和第二列(“值”)到 NO .
  • 为每个目标添加正确的包含路径(目标build设置“标题搜索路径”)。在我的例子中,这将是:
    2.1.添加 TheirOldLib对于“旧”目标
    2.2.添加 TheirNewLib对于"new"目标

  • 第 1 步禁用 Xcode 的自动头文件映射功能,通过该功能,可以通过名称直接访问项目中包含的任何头文件,无论其实际路径如何。当两个标题具有相同的名称时,此功能会导致无法解决的歧义。

    第 2 步允许 #include "theirLib.h"在不限定头文件实际路径名的情况下工作。

    这两个步骤一起满足了我的两个约束。

    最后, USE_HEADERMAP据我所知,Apple 没有记录。我将为此填写错误报告,因为此设置在许多情况下至关重要,正如谷歌搜索所揭示的那样。报告为 rdar://7840694。同样在开放雷达上为 http://openradar.appspot.com/radar?id=253401

    关于xcode - 控制 Xcode 将包含的项目头文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2596695/

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