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. 优先考虑文件夹. 在系统包括,我们得到一个编译器错误。