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