2017-05-03 8 views
0

デフォルトでは、GNU C/C++コンパイラは、最初に-Iで指定されたディレクトリにインクルードしてから、標準のシステムディレクトリ内にインクルードします。GNU C/C++コンパイラには検索順序が含まれています

コンパイラで検索順序を逆にするにはどうすればよいですか?

現時点では、コンパイラが標準システムディレクトリ内のヘッダファイルを検索しないと言う-nostdincオプションを指定してコンパイラを呼び出しています。次に、標準システムディレクトリに-Iを渡してから、の前にすべてを含めます。

これを実現する方法はありますか?たぶんコンパイラオプション?


UPDATE:ユーザーが尋ねたよう、私はTMY質問をより明確にするためにここにいくつかの追加情報を追加します。

compilation setup

私は図のセットアップと私は、コンパイラの検索パスの順序を逆しなければならない理由を理解するのに役立つことを願っています。

私はユニットテストのソースファイル

最後に
CPPFLAGS   = -c -std=gnu++11 -v -g -O0 -pipe -Wall -MMD -MP -D__STDC_LIMIT_MACROS 
TEST_INCLUDE_PATH = -I$(GMOCK_DIR)/include -I$(GMOCK_DIR)/gtest/include -I$(ECOS_INSTALL_DIR)/include 

コンパイルしようとすると:

gcc $(CPPFLAGS) $(TEST_INCLUDE_PATH) 

を、私はエラーの多くを得ました。コンパイラのインクルード順序をチェックすることで、コンパイラは、間違ったディレクトリ(この場合はeCos)内のいくつかのシステムヘッダファイルのヘッダファイルを見つけ出します。詳細については

#include "..." search starts here: 
#include <...> search starts here: 
../../../../Common/Implementation/TestLibraries/gmock-1.7.0/include 
../../../../Common/Implementation/TestLibraries/gmock-1.7.0/gtest/include 
../../Implementation/Build/eCos_install/include 
/usr/lib/gcc/i686-pc-cygwin/5.4.0/include/c++ 
/usr/lib/gcc/i686-pc-cygwin/5.4.0/include/c++/i686-pc-cygwin 
/usr/lib/gcc/i686-pc-cygwin/5.4.0/include/c++/backward 
/usr/lib/gcc/i686-pc-cygwin/5.4.0/include 
/usr/include 
/usr/lib/gcc/i686-pc-cygwin/5.4.0/../../../../include/w32api 
End of search list. 

、私のユニットテストは、そのような瞬間になります

最後に
CPPFLAGS   = -c -std=gnu++11 -v -g -O0 -pipe -Wall -MMD -MP -D__STDC_LIMIT_MACROS -nostdinc 
SYSTEM_INCLUDE_PATH = -I$(GCC_CYGWIN_PATH)/include/c++ .... 
TEST_INCLUDE_PATH = -I$(GMOCK_DIR)/include -I$(GMOCK_DIR)/gtest/include -I$(ECOS_INSTALL_DIR)/include 

gcc $(CPPFLAGS) $(SYSTEM_INCLUDE_PATH) $(TEST_INCLUDE_PATH) 

#include "..." search starts here: 
#include <...> search starts here: 
/usr/lib/gcc/i686-pc-cygwin/5.4.0/include/c++ 
/usr/lib/gcc/i686-pc-cygwin/5.4.0/include/c++/i686-pc-cygwin 
/usr/lib/gcc/i686-pc-cygwin/5.4.0/include/c++/backward 
/usr/lib/gcc/i686-pc-cygwin/5.4.0/include 
/usr/include 
/usr/lib/gcc/i686-pc-cygwin/5.4.0/../../../../include/w32api 
../../../../Common/Implementation/TestLibraries/gmock-1.7.0/include 
../../../../Common/Implementation/TestLibraries/gmock-1.7.0/gtest/include 
../../Implementation/Build/HostMCU_icb_jtag_install/include 
End of search list. 
注文すべてが正常にコンパイル反転し

#include "gmock/gmock.h" 

class TestDummy : public ::testing::Test 
{ 
    public: 
    TestDummy() {} 
}; 

TEST_F(TestDummy, ShouldFail) 
{ 
    ASSERT_TRUE(false); 
} 


+0

['-isystem'](https://gcc.gnu.org/onlinedocs/cpp/Search-Path.html)のオプションが役立つかもしれません。 – piwi

+0

非システム(_e.g._プロジェクト)ヘッダーのシステム(_e.g._標準ライブラリ_および特定のプロジェクトの一部ではない外部依存関係)には ''を、ヘッダーには ''ヘッダー」を使用します。システムヘッダのパスを追加するには、 '-isystem'を@piwiとして使用します。 – You

+0

それは私の場合は動作しません。組み込みOSのドライバの中には、Cygwinで単体テストを構築する必要があります。したがって、組み込みOSの '

'はCygwinのヘッダファイルと見なされますが、これは間違っていて見つからないことさえあります。 – lucab0ni

答えて

1

あなたが後にホストシステムを検索するディレクトリを含めるeCosのシステムが必要な場合は、ディレクトリが含ま-idirafterを使用します。the GCC manual, chapter 12 “Invocationから

TEST_INCLUDE_PATH = -I$(GMOCK_DIR)/include -I$(GMOCK_DIR)/gtest/include -idirafter $(ECOS_INSTALL_DIR)/include 

次のように

検索順序は次のとおりです。

  1. includeディレクティブの引用形式については、di最初に現在のファイルの長方形が検索されます。
  2. インクルード・ディレクティブの見積もり形式の場合、-iquoteオプションで指定されたディレクトリは、コマンド行に表示されるとおり、左から右の順に検索されます。
  3. -Iオプションで指定されたディレクトリは、左から右の順序でスキャンされます。
  4. -isystemオプションで指定されたディレクトリは、左から右の順序でスキャンされます。
  5. 標準のシステムディレクトリがスキャンされます。
  6. -idirafterオプションで指定されたディレクトリは、左から右の順にスキャンされます。
関連する問題