c++ - 是否可以强制编译器使用 "working"目录的名称来构造包含的所有全名?

标签 c++ path include environment-variables

让我们假设在 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++ 编译器的标志由 CXXFLAGSCFLAGS 变量。

关于c++ - 是否可以强制编译器使用 "working"目录的名称来构造包含的所有全名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15496629/

相关文章:

c++ - Qt::UniqueConnection 是如何工作的?

c++ - 未对齐读/写的可移植性如何?

java - 我如何告诉 Java 在哪里可以找到 native 库?

c++ - 保护某些包含位置

c++ - 包含多个变量的字符串或函数 (c++)

c++ - 委派 OnUpdate ... MFC 中来自 CMainFrame 的消息

c++ - 多色编辑字段 (Win32)

去获取父目录

java - XML 文件提取 - 相对路径不起作用

c++ - 为什么我需要写 "std::string"而不是 "std::getline()"?