g++
给我形式的错误:
foo.cc:<line>:<column>: fatal error: <bar>: No such file or directory
compilation terminated.
用 .编译 C 程序时也是如此gcc
。
这是为什么?
请注意:这个问题以前被问过很多次,但每次都是针对提问者的情况。这个问题的目的是提出一个问题,其他人可以一劳永逸地关闭作为重复的问题;常见问题解答。
您的编译器刚刚尝试编译名为foo.cc
. 在点击 line numberline
时,编译器会发现:
#include "bar"
或者
#include <bar>
然后编译器尝试找到该文件。为此,它使用一组目录进行查看,但在这组目录中,没有文件bar
。有关 include 语句版本之间差异的解释,请参见此处。
g++
有一个选项-I
。它允许您将包含搜索路径添加到命令行。假设您的文件bar
位于名为 的文件夹中frobnicate
,相对于foo.cc
(假设您正在从所在目录编译foo.cc
):
g++ -Ifrobnicate foo.cc
您可以添加更多包含路径;你给的每一个都是相对于当前目录的。Microsoft 的编译器有一个/I
以相同方式工作的相关选项,或者在 Visual Studio 中,可以在项目的属性页中设置文件夹,在配置属性->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/
这两种形式都是如此,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>
是标准头文件,所以它会将您的 C++ 平台附带#include
的命名文件作为标准库的一部分。list
这有点简化,但应该给你基本的想法。
<>
/ ""
-priorities的详细信息和-I
根据gcc-documentation,在“普通 Unix 系统”上,优先级include <>
如下:
/usr/local/include
libdir/gcc/target/version/include
/usr/target/include
/usr/include
对于 C++ 程序,它也会首先在 /usr/include/c++/version 中查找。在上面,target 是系统 GCC 被配置为编译代码的规范名称;[...]。
该文档还指出:
您可以使用 -Idir 命令行选项添加到此列表。在默认目录之前,按从左到右的顺序搜索所有由 -I 命名的目录。唯一的例外是默认情况下已经搜索了 dir。在这种情况下,该选项将被忽略,系统目录的搜索顺序保持不变。
继续我们的#include<list> / #include"list"
示例(相同的代码):
g++ -I. main.cc
和
#include<list>
int main () { std::list<int> l; }
事实上,-I.
文件夹优先于.
系统包括,我们得到一个编译器错误。
此外,似乎存在编译器错误,如果您在头文件名中包含字符“struct”或“Struct”,编译器将抛出相同的“没有这样的文件或目录”错误。
这对我有用, sudo apt-get install libx11-dev