gcc / g ++:“没有这样的文件或目录”

g++给我错误的forms:

 foo.cc:<line>:<column>: fatal error: <bar>: No such file or directory compilation terminated. 

gcc编译C程序是一样的。

这是为什么?


请注意:这个问题之前已经提过很多次,但每次都是针对提问者的情况。 这个问题的目的是要有一个问题,其他人可以作为一劳永逸的重复closures ; 常见问题

您的编译器只是试图编译名为foo.cc的文件。 点击行号line ,编译器发现:

 #include "bar" 

要么

 #include <bar> 

编译器然后尝试find该文件。 为此,它使用一组目录来查看,但在这个集合中,没有文件bar 。 包含声明的版本之间的差异的解释看这里 。

如何告诉编译器在哪里find它

g++有一个选项-I 。 它允许您将包含searchpath添加到命令行。 想象一下,你的文件bar是在一个名为frobnicate的文件夹中,相对于foo.cc (假设你是从foo.cc所在的目录编译的):

 g++ -Ifrobnicate foo.cc 

您可以添加更多包含path; 你给的每一个都是相对于当前目录。 微软的编译器有一个相关的选项/I ,工作方式相同,或者在Visual Studio中,可以在configuration属性 – > C / C ++ – >常规 – >其他包含目录下,在项目的属性页面中设置文件夹。

现在想象你有不同文件夹中的多个版本的bar ,给出:


 // A/bar #include<string> std::string which() { return "A/bar"; } 

 // B/bar #include<string> std::string which() { return "B/bar"; } 

 // C/bar #include<string> std::string which() { return "C/bar"; } 

 // foo.cc #include "bar" #include <iostream> int main () { std::cout << which() << std::endl; } 

#include "bar"的优先级是最左边的:

 $ g++ -IA -IB -IC foo.cc $ ./a.out A/bar 

如你所见,当编译器开始查看A/B/C/ ,它停在第一个或最左边的命中。

这两种forms都是如此, include <>incude ""

#include <bar>#include "bar"之间的区别

通常情况下, #include <xxx>首先查看系统文件夹, #include "xxx"使其首先查看当前或自定义文件夹。

例如:

想象一下你的项目文件夹中有以下文件:

 list main.cc 

main.cc

 #include "list" .... 

为此,你的编译器将#include你的项目文件夹中的文件list ,因为它目前正在编译main.cc并且在当前文件夹中有那个文件list

但是用main.cc

 #include <list> .... 

然后g++ main.cc ,你的编译器会首先查看系统文件夹,而且由于<list>是一个标准头文件,所以它将包含名为list的文件,作为标准库的一部分随C ++平台提供。

这有点简单,但应该给你基本的想法。

有关<> / "" priorities和-I详细信息

根据gcc文档 , include <>的优先级是在“普通的Unix系统”上,如下所示:

  /usr/local/include libdir/gcc/target/version/include /usr/target/include /usr/include 

对于C ++程序,它也将首先查看/ usr / include / c ++ / version。 在上面,目标是GCC被configuration为编译代码的系统的规范名称; […]。

该文件还指出:

您可以使用-Idir命令行选项添加到此列表。 所有由-I命名的目录在默认目录之前按照从左到右的顺序被search。 唯一的例外是当默认情况下已经search了dir。 在这种情况下,该选项将被忽略,系统目录的search顺序保持不变。

继续我们的#include<list> / #include"list"例子(相同的代码):

 g++ -I. main.cc 

 #include<list> int main () { std::list<int> l; } 

事实上, -I. 优先考虑文件夹. 在系统包括,我们得到一个编译器错误。