103

g++给我形式的错误:

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

用 .编译 C 程序时也是如此gcc

这是为什么?


请注意:这个问题以前被问过很多次,但每次都是针对提问者的情况。这个问题的目的是提出一个问题,其他人可以一劳永逸地关闭作为重复的问题;常见问题解答

4

3 回答 3

137

您的编译器刚刚尝试编译名为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.文件夹优先于.系统包括,我们得到一个编译器错误。

于 2012-10-16T16:17:04.333 回答
0

此外,似乎存在编译器错误,如果您在头文件名中包含字符“struct”或“Struct”,编译器将抛出相同的“没有这样的文件或目录”错误。

于 2021-10-25T19:04:53.197 回答
-3

这对我有用, sudo apt-get install libx11-dev

于 2020-12-02T16:46:43.360 回答