2017-01-25 8 views
0

私はassert.hというファイルをいくつかのアサーションマクロを定義しています。このプロジェクトはCoreと呼ばれ、同じ名前のフォルダに存在します。ただし、このファイルはCore/hulにあります。これは、いくつかの抽象ユーティリティを実装するプロジェクトのサブモジュールです。ここでは、ファイルの抜粋です:Xcode/clangに間違ったファイルが含まれています

#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に展開されるマクロが定義されます。これまでのところすべてOK。

問題は、<hul/assert.h>または<assert.h>を含めても、常に含まれているhul/assert.hです。これは、私が望むものではありません。これは、hul/assert.hhulフォルダの資格を持つ理由の1つです。

最初に確認するのは、Other C FlagsHeader Search Pathsです。しかし、その後は空で、次のように前者は次のとおりです。

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

あなたが見ることができるように、Core/hulが含まれていないので、#include <assert.h>hul/assert.hに解決すべきではありません。問題は、それはなぜですか?私はいくつかの設定が欠けていますか?

注:もちろん、私はファイルの名前を変更することができますが、なぜこれが起こっているのか理解しています。このフレームワークは依然としてファイルの数が膨大になり、この種の競合については気にしたくありません。

答えて

1

セットUSE_HEADERMAP = NOYESに設定すると、XCodeは、コンパイルを高速化するために、ヘッダーファイル名を見つけるためのパスにマップする辞書を使用します。だからあなたのヘッダファイルをどこに置いても、このマップに彼の道が見つかった場合は、それが見つかるでしょう。

別の方法は、すべてのユーザーヘッダーファイルに絶対パスを使用することです。 #include "./assert.h"(ファイルがプロジェクトディレクトリに直接配置されていないか、手動でユーザーヘッダーの検索パスが定義されている場合はエラーとなります)。

希望します。

+1

完璧!ありがとうございました。 –

関連する問題