Xcode / clang包含错误的文件

时间:2017-01-25 19:46:34

标签: c xcode clang

我有一个名为assert.h的文件,它定义了几个断言宏。该项目名为Core,位于具有相同名称的文件夹中。但是,此文件位于Core/hul,这是实现一些抽象实用程序的项目的子模块。这是该文件的摘录:

#if defined(HUL_DEBUG)
#   if defined(HUL_TEST)
#       define HUL_ASSERT(e)    HUL_TEST_ASSERT(e)
#   else
#       include <assert.h>
#       define HUL_ASSERT(e)    assert(e)
#   endif
#else
#   define HUL_ASSERT(e)        /* empty, do nothing */
#endif

如您所见,当定义HUL_TEST时,断言宏扩展为单元测试断言回调。这很好。在编译发布时(例如,HUL_DEBUG未定义),它什么都不做。还好。在编译调试时(不进行测试),它包含系统的assert.h并定义一个扩展为assert的宏。到目前为止一切都还可以。

问题在于,无论包括<hul/assert.h>还是<assert.h>,它都包含hul/assert.h,这不是我想要的。这是hul/assert.h文件夹下hul合格的原因之一。

首先要检查的是Other C FlagsHeader Search Paths。但后者是空的,前者如下:

-I../../include/Core
-I../../test/include/Core
-I../../test/include

如您所见,Core/hul未包含在内,因此#include <assert.h>不应解析为hul/assert.h。问题是,为什么呢?我错过了一些配置吗?

注意:当然我可以更改文件的名称,但我更理解为什么会这样。这个框架在文件数量上仍然会有很大的增长,我不想担心这种冲突。

1 个答案:

答案 0 :(得分:1)

设置USE_HEADERMAP = NO。设置为YES时,XCode使用字典将头文件名映射到要查找的路径,以加快编译速度。因此,无论您将头文件放在何处,如果它已经找到了进入此地图的方式,它将被发现。

另一种方法是对所有用户头文件使用绝对路径,例如#include "./assert.h"(如果文件不直接位于项目目录中或任何手动定义用户标题搜索路径,则应该给出错误。)

希望它有所帮助;