如果程序有`#include`语句,你是否需要在`gcc`中使用`-I`标志?

时间:2013-11-27 13:04:31

标签: c gcc include

在我的C我的程序中,我使用#include语句包含了我需要的头文件。

在[在Linux服务器上]编译时,我是否还需要-I/命令中的gcc标志?

我注意到在某些地方它被包括在内,但在其他一些地方却没有。我真的很感激一个明确的答案。

非常感谢!

2 个答案:

答案 0 :(得分:2)

有一组标准的include目录。对于gcc,请检查预处理器:

 cpp -v < /dev/null

哪个输出:

#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /usr/lib/gcc/x86_64-redhat-linux/4.4.7/include
 /usr/include
End of search list.

这些通常涵盖标准标题等。对于您自己的标头,尤其是在文件夹层次结构中,您可能需要额外的-I标记。

答案 1 :(得分:0)

简而言之,-I告诉编译器在哪里查找标题。

编译器已经搜索了一些路径,例如/usr/include。对于这些标头,您不需要-I(例如标准标头或已安装的库)。对于编译器未知的位置的标头,例如您自己的程序或已下载源的库,您需要指定包含路径(通过-I)否则编译器不知道在哪里找到包含文件。

请注意,当您使用"file"而不是<file>时,编译器首先会搜索包含文件本身所在的目录。例如,假设你有一个像这样的目录结构:

project
|
+- include
|  |
|  +- header1.h
|  |
|  `- header2.h
|
`- src
   |
   +- funcs1.c
   |
   +- funcs2.c
   |
   `- internal.h

现在让我们看一些例子:

funcs1.c:

#include "internal.h"

编译此内容不需要-I,因为internal.hfuncs1.c位于同一位置。

funcs1.c:

#include <internal.h>

如果您在与-I/path/to/project/src相同的目录中调用编译器,则需要-I.(或funcs1.c,因为#include <...>不会在源的目录中搜索文件。

funcs2.c:

#include <header1.h>
/* or */
#include "header1.h"

这需要-I/path/to/project/include(或-I../include如果您在与funcs2.c相同的目标中调用编译器,因为header1.h的位置对于编译器来说是未知的案件。请注意,这与调用编译器的位置无关,因为编译器不会查看调用它的目录,而是查看源文件所在的目录。

funcs1.c:

#include "internal.h"

internal.h:

#include "header2.h"

这仍然需要-I/path/to/project/include,因为即使发现internal.h中包含funcs1.c,它也会尝试包含header2.h,其路径需要告知编译器。