gcc/g++: "No such file or directory"

g++给了我表格上的错误:

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

gcc编译 C 程序也是如此。

为什么?


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

377558 次浏览

您的编译器刚刚尝试编译名为 foo.cc的文件。当点击行号 line时,编译器发现:

#include "bar"

或者

#include <bar>

然后编译器尝试查找该文件。为此,它使用一组目录进行查找,但是在这组目录中没有文件 bar。有关 include 语句版本之间差异的解释,请参阅 here

如何告诉编译器在哪里找到它

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

g++ -Ifrobnicate foo.cc

你可以添加更多的包含路径,每个路径都是相对于工作目录的。微软的编译器有一个相关选项 /I,它的工作方式与此相同,或者在 Visual Studio 中,文件夹可以在项目的属性页中设置,在配置属性-> C/C + +-> 常规-> 附加包含目录下。

Now imagine you have multiple version of bar in different folders, given:


// 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/时,它会在第一次或最左边的命中时停止。

This is true of both forms, include <> and incude "".

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

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

例如:

Imagine you have the following files in your project folder:

list
main.cc

main.cc合作:

#include "list"
....

为此,您的编译器将 #include文件 list在您的项目文件夹,因为它目前编译 main.cc和有该文件 list在当前文件夹。

但对于 main.cc:

#include <list>
....

然后是 g++ main.cc,编译器将首先查看系统文件夹,因为 <list>是标准头文件,它将 #include这个名为 list的文件,作为 C + + 平台标准库的一部分。

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

有关 <>/""-优先次序及 -I的详情

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

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

对于 C + + 程序,它也会首先查看/usr/include/c + +/version。在上面的代码中,target 是 GCC 被配置为编译代码的系统的规范名称; [ ... ]。

文件还说:

You can add to this list with the -Idir command line option. All the directories named by -I are searched, in left-to-right order, 在默认目录之前. The only exception is when dir is already searched by default. In this case, the option is ignored and the search order for system directories remains unchanged.

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

g++ -I. main.cc

还有

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

事实上,-I.优先于系统包含的文件夹 .,我们得到一个编译器错误。

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

此外,似乎有一个编译器错误,如果你包括字符“结构”或“结构”在您的头文件名,编译器将抛出相同的“没有这样的文件或目录”错误。