gcc -I 不更改包含目录

gcc -I doesn't change the include directory

我有一个名为 code/ 的文件夹,在这个文件夹下我有一个名为 include/ 的文件夹和名为 code.cc 的源文件,include/ 包含头文件a.hb.h,这两个头文件也存在于别处,为了使用include/文件夹中的头文件,我在我的Makefile,但是我的代码在其他地方仍然使用那些头文件,如果我按照下面的方式包含头文件,我的代码使用include/下的头文件,为什么-I标志更改包含目录?

#include "include/a.h"
#include "include/b.h"

编辑:目录:

code/code.cc
code/Makefile
code/include/a.h
code/include/b.h

生成文件:

CFLAGS = -Iinclude/
CFLAGS += -m32 
LDFLAGS = -Llib -llits -lrt -lpthread -Wl,-R,'lib'
code:code.cc
    gcc -o code $(CFLAGS) $(LDFLAGS) code.cc

gcc --version:

gcc (SUSE Linux) 4.3.4 [gcc-4_3-branch revision 152973]
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

-I 指令到 gcc 的顺序很重要。添加 "those header files in other places" 的 -I 指令必须在 -Iinclude 之前出现 /include

你必须使用

CFLAGS = -I<full_path_to_project>/code

如果 include 位于此目录下,并且您在 include 语句中包含与它相关的文件

#include "include/a.h"
      // ^^^^^^^^^

如果指定

CFLAGS = -I<full_path_to_project>/code/include

您不需要指定相对包含路径

#include "a.h"

-I 指定的相对路径将从 make 使用的工作目录开始。如果那里没有相对路径部分,则省略 -I 选项,或指定 -I./.

使用此设置:

code/code.cc
code/Makefile
code/include/a.h
code/include/b.h

并且通过将 -Iinclude/ 添加到编译器标志,您的 #include "include/a.h" 将首先在 include/ 文件夹中查找 include/a.h。即编译器查找不存在的 include/include/a.h,编译器在搜索路径的其他地方查找 include/a.h 文件。

您的代码要么必须使用 #include "a.h" ,要么您的 -Iinclude/ 必须是 -I. -I。将当前目录添加到搜索路径,这样 #include "include/a.h" 将匹配文件 ./include/a.h 确保 -I. 被添加到任何其他搜索路径之前,这些搜索路径也将匹配您包含的文件。