2017-05-03 74 views
0

默認情況下,GNU C/C++編譯器首先查找包含-I指定的目錄,然後包含在標準系統目錄中。GNU C/C++編譯器更改包括搜索順序

如何強制編譯器反轉搜索順序?

目前我正在調用編譯器的選項-nostdinc set,它表示編譯器不在標準系統目錄內搜索頭文件。然後,我在之前使用-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. 

有關信息,我的單元測試看起來此刻這樣的:

#include "gmock/gmock.h" 

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

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


通過顛倒順序一切編譯罰款:

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. 
+0

也許選項['-isystem'](https://gcc.gnu.org/onlinedocs/cpp/Search-Path.html)可以幫到你。 – piwi

+0

使用'

'表示系統(_e.g._標準庫_和外部依賴項不是您特定項目_的一部分)標頭和用於非系統(_e.g._項目)標頭的「頭」。要添加系統頭文件路徑,使用'-isystem'作爲@piwi提到的。 – You

+0

這對我來說不起作用。我必須在Cygwin中爲嵌入式操作系統的某些驅動程序構建單元測試。所以嵌入式操作系統的'

'被視爲Cygwin的頭文件,這是錯誤的,甚至不會被發現。 – lucab0ni

回答

1

如果你想在eCos的系統包括被搜索目錄主機系統包括目錄,使用-idirafter

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

the GCC manual, chapter 12 「Invocation

查找順序如下:

  1. 對於include指令的引用形式,di首先搜索當前文件的源文件。
  2. 對於include指令的引用形式,由-iquote選項指定的目錄按照從左到右的順序搜索,因爲它們出現在命令行上。
  3. 使用-I選項指定的目錄按從左到右的順序掃描。
  4. -isystem選項指定的目錄按從左到右的順序掃描。
  5. 掃描標準系統目錄。
  6. -idirafter選項指定的目錄按從左到右的順序掃描。