0

让我们假设 in first.hwe have#include "aaa/second.h"和 in the aaa/second.hwe 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 子目录中)。

在另一个终端,同样的编译命令,在同一个目录下不会造成任何问题。原因显然在于环境变量的值。

4

2 回答 2

3

您应该为您的项目全局设置包含路径。在您的示例中,您可以将一些选项传递-I /home/bucky给您的编译器(如果它是 GCC 或 Clang)。MSVC 有类似的选项。

<...>(所有#include 都相对于包含路径进行搜索。和之间的区别在于"..."后者也搜索当前目录。)

于 2013-03-19T10:16:30.640 回答
3

是的。确切的机制取决于编译器,但总而言之,您需要配置编译器以将项目路径包含在搜索路径中。对于 GCC 和 clang,这是通过-I命令行标志 ( -I path/of/first.cpp) 完成的。此配置通常在项目设置(如果您使用 IDE)、Makefile 或类似文件中完成。

Since you’re talking about environment variables: the flags that are passed to the g++ and c++ compiler are controlled by the CXXFLAGS and CFLAGS variables.

于 2013-03-19T10:16:56.227 回答