【问题标题】:gcc/g++: "No such file or directory"gcc/g++:“没有这样的文件或目录”
【发布时间】:2021-12-13 12:34:03
【问题描述】:

g++ 给我错误的形式:

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

gcc编译C程序也是一样。

这是为什么呢?


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

【问题讨论】:

    标签: c++ c gcc g++ c++-faq


    【解决方案1】:

    另外,如果你在头文件名中包含字符“struct”或“Struct”,编译器会抛出同样的“没有这样的文件或目录”错误。

    【讨论】:

    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    • 如果您有新问题,请点击 按钮提出问题。如果有助于提供上下文,请包含指向此问题的链接。 - From Review
    【解决方案2】:

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

    【讨论】:

    【解决方案3】:

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

    #include "bar"
    

    #include <bar>
    

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

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

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

    g++ -Ifrobnicate foo.cc
    

    您可以添加更多包含路径;你给的每一个都是相对于当前目录的。 Microsoft 的编译器有一个关联选项/I 以相同的方式工作,或者在 Visual Studio 中,可以在项目的属性页中设置文件夹,在 Configuration Properties->C/C++->General->Additional Include Directories 下.

    现在假设您在不同的文件夹中有多个版本的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 &lt;&gt;incude "" 这两种形式都是如此。

    #include &lt;bar&gt;#include "bar" 之间的区别

    通常,#include &lt;xxx&gt; 使其首先查看系统文件夹,#include "xxx" 使其首先查看当前或自定义文件夹。

    例如:

    假设您的项目文件夹中有以下文件:

    list
    main.cc
    

    main.cc:

    #include "list"
    ....
    

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

    但是main.cc:

    #include <list>
    ....
    

    然后g++ main.cc,您的编译器将首先查看系统文件夹,并且因为&lt;list&gt; 是标准头文件,它会#include 将您的C++ 平台附带的名为list 的文件作为标准库。

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

    &lt;&gt;/""-priorities 和 -I 的详细信息

    根据gcc-documentationinclude &lt;&gt; 的优先级是,在“普通 Unix 系统”上,如下:

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

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

    文档还指出:

    您可以使用 -Idir 命令行选项添加到此列表中。以从左到右的顺序搜索所有由 -I 命名的目录,在默认目录之前。唯一的例外是默认情况下已经搜索了 dir。在这种情况下,该选项将被忽略,系统目录的搜索顺序保持不变。

    继续我们的#include&lt;list&gt; / #include"list" 示例(相同的代码):

    g++ -I. main.cc
    

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

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

    【讨论】:

    • 只是想让您注意到,您将编译器称为“您的编译器”有点奇怪,因为问题和答案的作者相同。
    • @Jeffrey:也许问题的作者打算在这里适应一般格式。不知道,问他。
    • 这个答案是错误的,#include &lt;&gt; 在默认系统目录之前查看-I 列出的目录
    • "假设你的文件栏位于一个名为 frobnicate 的文件夹中,相对于 foo.cc" -I 给出的目录是相对于你运行 gcc 的目录,与正在编译的文件无关。如果您这样做g++ -Ifrobnicate blah/foo.cc,则差异很大
    • PATH 环境变量的设置(在 Linux 系统上)是否会影响编译器搜索文件的方式?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 2017-12-13
    相关资源
    最近更新 更多