让我们假设 in first.h
we have#include "aaa/second.h"
和 in the aaa/second.h
we have #include "bbb/third.h"
。我认为在“默认设置”中,如果“third.h”不在“aaa/bbb”中,编译器会抱怨。
是否有可能以这样的方式改变这种行为,即使用 所在的目录first.cpp
来构造所有包含的全名?
例如,如果“first.h”位于“/home/bucky/”中,那么#include "bbb/third.h"
(来自“aaa/second.h”)应该被解释为/home/bucky/bbb/third.h
而不是/home/bucky/aaa/bbb/third.h
。
编辑
我无法更改整个源代码。在代码中使用引号代替尖括号。
g++ -std=c++0x name.cpp -o name
我在命令行中编译使用。我在两个不同的终端上做。看起来在第一个终端中,工作目录用于构造全名,而在第二个终端中并非如此。我几乎可以肯定它是由于环境变量而发生的,但我不知道是哪些。所以,我的问题是,在更大程度上,哪些环境变量可以强制编译器使用工作目录构造全名。
编辑 2
在我的 test.cpp 文件中,我包含“first.h”。这种包含不会导致任何问题(编译器参见“first.h”)。“first.h”文件包括“ppp/second.h”。它也不会引起任何问题。但是“ppp/second.h”包含“ppp/third.h”,这就是问题出现的地方。我认为问题的原因是“second.h”试图在second.h所在目录的“ppp”子目录中找到“third.h”。换句话说,second.h 试图在“ppp/ppp”子目录中找到第三个.h(因为 second.h 位于 ppp 子目录中)。
在另一个终端,同样的编译命令,在同一个目录下不会造成任何问题。原因显然在于环境变量的值。