在我的C
我的程序中,我使用#include
语句包含了我需要的头文件。
在[在Linux服务器上]编译时,我是否还需要-I/
命令中的gcc
标志?
我注意到在某些地方它被包括在内,但在其他一些地方却没有。我真的很感激一个明确的答案。
非常感谢!
答案 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.h
与funcs1.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
,其路径需要告知编译器。