GNU C / C ++编译器更改包括搜索顺序

时间:2017-05-03 07:15:45

标签: c++ c gcc compilation g++

默认情况下,GNU C / C ++编译器首先查找包含-I的目录,然后包含在标准系统目录中。

如何强制编译器反转搜索顺序?

目前我正在使用选项-nostdinc set来调用编译器,这表示编译器不会在标准系统目录中搜索头文件。然后我使用-I 传递标准系统目录,然后包括所有其他目录。

有没有更好的方法来实现这一目标?也许是编译器选项?


UPDATE 根据用户的要求,我在这里添加了一些其他信息,以使问题更加清晰。

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)

我遇到了很多错误。通过检查编译器的include顺序,我注意到编译器在错误的目录中找到了一些系统头文件的头文件(在这种情况下是在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.

1 个答案:

答案 0 :(得分: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伪指令的引用形式,首先搜索当前文件的目录。
  2.   
  3. 对于include伪指令的引用形式,-iquote选项指定的目录按从左到右的顺序搜索,因为它们出现在命令行中。
  4.   
  5. 使用-I选项指定的目录按从左到右的顺序进行扫描。
  6.   
  7. 使用-isystem选项指定的目录按从左到右的顺序进行扫描。
  8.   
  9. 扫描标准系统目录。
  10.   
  11. 使用-idirafter选项指定的目录按从左到右的顺序进行扫描。
  12.