2010-04-07 69 views
14

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

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

这里是我的项目文件的层次结构(这是在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以添加对封闭文件夹的引用也是我宁愿避免的,因为我需要使用条件编译指令来执行两次。
- 我可以自由调整我的项目,因为我认为合适

感谢您的任何帮助。

回答

21

答案的关键部分是使用USE_HEADERMAP = NO,如Chris在评论中所建议的那样。这里是细节。

短配方(在Xcode 3.2.2选中):

  1. 添加USE_HEADERMAP的一个自定义生成设定= NO为每个关注目标。这里是如何:
    1.1。在“构建”窗格中打开目标的信息面板。
    1.2。拉下窗口左下角的动作弹出菜单,选择“添加用户定义的设置”。
    1.3。在新添加的行中,将第一列(“设置”)设置为USE_HEADERMAP,将第二列(“值”)设置为NO

  2. 为每个目标添加正确的包含路径(目标构建设置“标题搜索路径”)。在我的例子中是:
    2.1。为“旧”目标添加TheirOldLib
    2.2。添加TheirNewLib为“新”的目标

步骤1禁用的Xcode的自动头部地图功能,通过它包含在项目中的任何头文件是通过它的名字,不管它的实际路径直接访问。当两个标题具有相同的名称时,此功能会导致无法解决的歧义。

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

这两个步骤一起满足了我的两个约束。据我所知,最后,USE_HEADERMAP而不是。我会填写一份错误报告,因为这个设置在很多情况下都非常重要,因为它使用Google进行展示。报告为rdar:// 7840694。同样在开放式雷达上,因为http://openradar.appspot.com/radar?id=253401

+0

这很好用。谢谢。海报应该标记为答案。 – SmallChess 2010-12-04 13:25:58

+2

不应该在第2步。是“用户标题搜索路径”而不是“标题搜索路径”?因为你使用#include“”而不是#include <> – Olof 2012-04-13 11:30:03

+0

我想你是对的。 'Header Search Paths'起作用,但'User Header Search Paths'应该更好。 – 2012-04-13 15:43:03

0

为什么你不能在每个目标中使用不同的包含路径?

+2

如果您有两个具有相同名称但路径不同的标头,则需要在两个目标中的自定义生成设置中设置USE_HEADERMAP = NO。 – cdespinosa 2010-04-08 02:58:42

+0

整洁。我想我从来没有尝试过。很高兴看到Mike Ferris仍在与可用性做斗争。 – 2010-04-08 03:16:59

+0

在每个目标中使用不同的包含路径不起作用:包含文件*在*项目总是可以由Xcode访问,根本没有路径。这就是为什么这个问题首先出现的原因:没有消除歧义的道路,似乎没有办法告诉Xcode哪个是正确的文件。克里斯的建议是禁用该功能,以扭转更传统的包含路径方案。我会详细写出答案。 – 2010-04-08 08:23:28

相关问题