gcc/g++: “没有这样的文件或目录”

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

提问人:Sebastian Mach 提问时间:10/17/2012 最后编辑:Sebastian Mach 更新时间:10/26/2021 访问量:428134

问:

g++给我表格的错误:

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

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

为什么?


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

C C GCC G C++-常见问题

评论


答:

155赞 Sebastian Mach 10/17/2012 #1

编译器刚刚尝试编译名为 .在命中行号时,编译器会发现:foo.ccline

#include "bar"

#include <bar>

然后,编译器会尝试查找该文件。为此,它使用一组目录进行查看,但在此集中,没有 文件 .有关 include 语句版本之间差异的说明,请查看此处bar

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

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

g++ -Ifrobnicate foo.cc

您可以添加更多包含路径;您给出的每个目录都是相对于当前目录的。Microsoft 的编译器有一个以相同方式工作的相关选项,或者在 Visual Studio 中,可以在项目的“属性页”中的“配置属性”->C/C++->常规->其他包含目录下设置文件夹。/I

现在想象一下,您在不同的文件夹中有多个版本,给定: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"
....

为此,编译器将文件放在项目文件夹中,因为它当前正在编译,并且当前文件夹中有该文件。#includelistmain.cclist

但是随着:main.cc

#include <list>
....

然后,您的编译器将首先查看系统文件夹,并且由于是标准标头,因此它将作为标准库的一部分随 C++ 平台一起命名的文件。g++ main.cc<list>#includelist

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

有关 /-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..

评论

12赞 Shoe 10/17/2012
只是想让你注意到,你把你的编译器称为“你的编译器”有点奇怪,因为问题和答案的作者是同一个。
36赞 Sebastian Mach 10/17/2012
@Jeffrey:也许这个问题的作者打算适应这里的一般格式。不知道,问问他。
1赞 Jonathan Wakely 10/18/2012
这个答案是错误的,在默认系统目录之前列出的目录中查找#include <>-I
6赞 Jonathan Wakely 10/18/2012
"想象一下,您的文件栏位于一个名为 frobnicate 的文件夹中,相对于 foo.cc“ 给出的目录是相对于您运行 gcc 的目录,而不是相对于正在编译的文件。如果你这样做,差异是显着的-Ig++ -Ifrobnicate blah/foo.cc
3赞 Matt Phillips 11/11/2012
环境变量的设置(在 Linux 系统上)是否会影响编译器搜索文件的方式?PATH
-5赞 JavierQuispe 12/3/2020 #2

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

0赞 Robert Frederick 10/26/2021 #3

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

评论

0赞 Community 10/26/2021
正如目前所写的那样,你的答案尚不清楚。请编辑以添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。您可以在帮助中心找到有关如何写出好答案的更多信息。
0赞 Yang Yushi 10/26/2021
如果您有新问题,请单击“提问”按钮提出问题。如果有助于提供上下文,请附上指向此问题的链接。- 从评论