如果我想要包含要搜索头文件的目录,这是首选方式,为什么?
答案 0 :(得分:18)
查看此方法的一种方法是使用-I
控制的标题和-isystem
使用的标题(系统,第三方库)。当启用警告时,会产生实际差异,因为来自-isystem
标题的警告将被抑制。
答案 1 :(得分:7)
将目录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;。