有没有办法控制每个目标所包含的头文件?
这是我的项目文件层次结构(在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他们的Lib.h是否包含每个目标?
约束:
– 两个头文件具有相同的名称.作为最后的手段,我可以重命名其中一个,但我宁愿避免这种情况,因为这将导致主要的头发拉在其他平台上.
– 必须更改#include以添加对封闭文件夹的引用也是我宁愿避免的,因为我需要使用条件编译指令两次.
– 我可以自由地调整我的项目,否则认为合适
感谢任何帮助.
解决方法
简短的食谱(在Xcode 3.2.2中检查):
>为每个相关目标添加USE_HEADERMAP = NO的自定义构建设置.这是怎么回事?
1.1.在“构建”窗格上打开目标的信息面板.
1.2.拉下窗口左下角的动作弹出菜单,选择“添加用户定义设置”.
1.3.在新添加的行中,将第一列(“设置”)设置为USE_HEADERMAP,将第二列(“值”)设置为NO.
>为每个目标添加正确的包含路径(目标构建设置“标题搜索路径”).在我的例子中是:
2.1.将他们的OldLib添加为“旧”目标
2.2.添加他们的NewLib为“新”目标
步骤1禁用Xcode的自动标题映射功能,通过它可以通过其名称直接访问项目中包含的任何头文件,无论其实际路径如何.当两个标题具有相同的名称时,此功能会导致无法解决的歧义.
步骤2允许#include“themLib.h”工作,而不限定头文件实际路径名.
这两个步骤一起实现了我的两个限制.
最后,据我所知,苹果公司没有记录USE_HEADERMAP.我会填写一个错误报告,因为这个设置在许多情况下至关重要,因为它的谷歌搜索显示.报告为rdar:// 7840694.还打开雷达为http://openradar.appspot.com/radar?id=253401