-I dir vs. -isystem dir

时间:2010-04-05 16:41:17

标签: c gcc

如果我想要包含要搜索头文件的目录,这是首选方式,为什么?

5 个答案:

答案 0 :(得分:18)

查看此方法的一种方法是使用-I控制的标题和-isystem使用的标题(系统,第三方库)。当启用警告时,会产生实际差异,因为来自-isystem标题的警告将被抑制。

答案 1 :(得分:7)

来自gcc documentation for -I

  

将目录dir添加到要搜索头文件的目录列表的头部。这可以用于覆盖系统头文件,替换您自己的版本,因为在系统头文件目录之前搜索这些目录。但是,您不应使用此选项添加包含供应商提供的系统头文件的目录(使用--isystem)。如果使用多个-I选项,则按从左到右的顺序扫描目录;标准系统目录来自。

     

如果标准系统包含目录或使用-isystem指定的目录也使用-I指定,则将忽略-I选项。该目录仍将被搜索,但作为系统目录在系统中的正常位置包括链。这是为了确保GCC修复错误系统头的过程和include_next指令的顺序不会被无意中更改。如果确实需要更改系统目录的搜索顺序,请使用-nostdinc和/或-isystem选项。

因此-I可能是指定头文件位置的首选选项,但供应商提供的系统头等特殊情况除外。

答案 2 :(得分:1)

您应该使用-I指定标题的位置。

在处理-I后搜索您使用-isystem指定的文件,并通过gcc接收特殊处理(与标准系统头相同)。

答案 3 :(得分:0)

所以这是我通过运行一些实验发现的区别。想象一下以下设置:

my_std_lib / stdio.h

#ifndef _CUSTOM_STDIO_H

void test() {}

#endif

#include_next <stdio.h>
#include_next <custom.h>

my_user_lib / custom.h

#ifndef _CUSTOM_HEADER_H

void custom_func() {}

#endif

main.cpp

#include "stdio.h"

int main() {
  test();
  custom_func();
  printf("Hello world!");
  return 0;
}

如果使用 g++ -isystem my_std_lib -isystem my_user_lib main.cpp一切正常。

但是,g++ -isystem my_std_lib -I my_user_lib main.cpp将导致错误

In file included from main.cpp:1:
my_std_lib/stdio.h:10:15: fatal error: 'custom.h' file not found
#include_next <custom.h>
              ^~~~~~~~~~
1 error generated.

那是怎么回事?

据我了解,当我编写#include "stdio.h"时,GCC将开始遍历可用的头文件列表,直到找到my_std_lib/stdio.h。该文件末尾的指令#include_next <custom.h>告诉编译器通过从其 current 位置开始遍历include目录来搜索custom.h

当我使用my_user_lib标志将-I添加到目录列表时,它出现在目录列表中所有系统目录的之前。因此,它出现在my_std_lib目录之前的列表中,并且#include_next失败。

如果我使用g++ -isystem my_user_lib -isystem my_std_lib main.cpp进行编译,也会发生同样的情况。显然,目录是按照指定标志的顺序添加到列表的,因此,my_user_lib会再次出现在my_std_lib之前。

因此,简而言之,-I-isystem在将目标添加到包含目录列表的方式上有所不同。

答案 4 :(得分:-1)

当你包含一个标题&#34; Myheader.h&#34;使用-I,编译器生成搜索顺序:&#34; Myheader.h&#34; ,&#34; system / headers&#34;。因此,如果在&#34; MyHeader.h&#34;中找不到某些东西。你回退&#34;系统/标题&#34;。但是当你使用-isystem时,你基本上就是说替换&#34; system / headers&#34;无论我给你什么。因此,不再需要退回&#34; system / headers&#34;。