2013-03-19 29 views
0

让我们假设在first.h我们#include "aaa/second.h"并在aaa/second.h我们有#include "bbb/third.h"。我认为,如果“third.h”不在“aaa/bbb”中,编译器会在“默认设置”中发出抱怨。是否可以强制编译器使用“working”目录的名称来构建包含所有全名?

是否有可能以这种方式改变这种行为: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。我在两个不同的终端做。它看起来像在第一个终端工作目录用来构造全名,在第二个终端,情况并非如此。我几乎可以肯定,它是由于环境变量而发生的,但我不知道哪些变量。所以,我的问题是,在更大程度上,什么样的环境变量可以强制编译器使用工作目录来构造全名。

EDIT 2

在我TEST.CPP文件I包括 “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子目录中)。

在另一终端中,相同的编译命令,在同一目录中不会引起任何问题。其原因显然在于环境变量的价值。

+0

你错过任何引号或尖括号在你的第二个'#include'。 – 2013-03-19 10:17:12

+0

@Kerrek SB,谢谢。我需要引号。 – Roman 2013-03-19 10:20:07

回答

3

是。确切的机制取决于编译器,但其短而长的一点是,您需要配置编译器以将项目路径包含在搜索路径中。 GCC和铿锵的是威盛的-I命令行标志(-I path/of/first.cpp)来完成。这种配置通常在项目设置中完成(如果你使用IDE),Makefile或类似的。

由于您在谈论环境变量:传递给g++c++编译器的标志由CXXFLAGSCFLAGS变量控制。

+0

我以为引用应该用于'/ home/bucky/aaa/second.h'中'_I/home/bucky'中的自己的头文件'aaa/second.h',用于指示编译器的位置看。尖括号只用于'/ usr/include/time.h'中的系统头文件'time.h'。实际上,大多数编译器不区分<>和“” – DanS 2013-03-19 10:24:48

+0

@Dan否,编译器*会区分它们。不同的是Kerrek写的,但是你可以(并且在我的书中,*应该*)在你不使用时使用尖括号包含相对于本地目录。这就是发生在这里的情况:您正在使用包含相对于(配置)的搜索路径。尖括号在这里是正确和适当的。它们绝对*不限于系统头文件。 – 2013-03-19 10:27:47

+0

@Konrad Rudolph,我对最初的问题进行了两次编辑,以澄清我的问题到底是什么。简而言之,我认为可以在不使用-I选项的情况下更改编译器的行为,也不用“<>”替换“”。 – Roman 2013-03-19 10:34:41

3

您应该建立包括全球范围内的项目路径。在你的例子中,你会通过一些选项如-I /home/bucky到你的编译器(如果它是GCC或Clang)。 MSVC有类似的选项。

(所有的#includes被搜索相对于包括路径。<...>"..."之间的区别是,后者也搜索当前目录。)

+0

在我的代码中我只有'“...”'。我用'g ++'编译。我没有使用'-I'选项。在一个终端中,编译器似乎使用工作目录的名称来构造所有的全名,而在另一个终端中则不是这样。它发生是因为环境变量,但我不知道哪些。 – Roman 2013-03-19 10:27:47

+0

我对最初的问题进行了两次编辑,以澄清我的问题到底是什么。简而言之,我认为可以在不使用-I选项的情况下更改编译器的行为,也不用“<>”替换“”。 – Roman 2013-03-19 10:35:07

相关问题