让我们假设在 first.h
中我们有 #include "aaa/second.h"
并且在 aaa/second.h
我们有 #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”子目录中找到third.h(因为second.h位于ppp子目录中)。
在另一个终端,同样的编译命令,在同一个目录下不会造成任何问题。原因显然在于环境变量的值。
最佳答案
是的。确切的机制取决于编译器,但总而言之,您需要配置编译器以将项目路径包含在搜索路径中。对于 GCC 和 clang,这是通过 -I
命令行标志 (-I path/of/first.cpp
) 完成的。此配置通常在项目设置(如果您使用的是 IDE)、Makefile 或类似文件中完成。
因为你在谈论环境变量:传递给 g++
和 c++
编译器的标志由 CXXFLAGS
和CFLAGS
变量。
关于c++ - 是否可以强制编译器使用 "working"目录的名称来构造包含的所有全名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15496629/