【问题标题】:Compiler error with filesystem library: clang and g++文件系统库的编译器错误:clang 和 g++
【发布时间】:2020-09-22 12:36:39
【问题描述】:

我正在用 c++ 编写一个个人项目,它需要访问某些目录中的文件,因此我决定使用filesystem 库。当我尝试在 MacOS 和 Linux 上编译我的项目时遇到了一些问题。

代码sn-p如下

#include <iostream>
#include <fstream>

int main(){

    std::string path = "Inner";

    std::cout << "Files in " << path << " directory :" << std::endl;

    for (const auto & entry : std::filesystem::directory_iterator(path))
        std::cout << entry.path() << std::endl;


    return 0;

}

当我在我的 MacBook Pro(clang 版本 11.0.3 (clang-1103.0.32.62))上使用

g++ -o test test.cpp -std=c++17 -Wall

一切正常。但是,一旦我迁移到 Linux(Ubuntu 19.04,g++ 8.3.0),我就会收到以下错误:

test.cpp: In function ‘int main()’:
test.cpp:8:33: error: ‘std::filesystem’ has not been declared
  for (const auto & entry : std::filesystem::directory_iterator(path)){

然后我将文件系统库包含在#include &lt;filesystem&gt;:

#include <iostream>
#include <fstream>
#include <filesystem>

int main(){

    std::string path = "Inner";

    std::cout << "Files in " << path << " directory :" << std::endl;

    for (const auto & entry : std::filesystem::directory_iterator(path))
        std::cout << entry.path() << std::endl;

    return 0;

}

通过g++ -o test test.cpp -std=c++17 -Wall -lstdc++fs 编译它,在Linux 上一切正常(注意我必须添加-lstdc++fs)。

为什么在 MacOS 和 Linux 上会有这种不同的行为?它取决于编译器吗? Windows 操作系统会发生什么(我家里没有任何 Windows PC)?


我找到了一个相关问题及其答案here,但它似乎无法解释为什么在第一种情况下(使用 clang)在不包括 filesystem 库的情况下一切正常。

【问题讨论】:

  • C++ 标准允许标准头文件包含来自其他标准头文件的声明。我想在第一种情况下,&lt;fstream&gt; 标头还包括部分或全部文件系统声明。
  • 我知道这个问题有很好的重复,但似乎找不到它们。无论如何,简短的解决方案:始终明确包含您使用的功能所需的头文件。 A good reference 帮助确定需要哪些标头。
  • @john 我认为-std=c++17 我将编译设置为使用相同的标准,但显然我错了。
  • @Eddymage 您使用的是相同的标准。只是标准有一定的灵活性,不同的编译器会做出不同的选择。
  • @Someprogrammerdude 是的,你是对的,我总是检查this,但在文件系统库页面中我找不到任何关于我的问题的线索,也没有在底部的注释中找到。

标签: c++ g++ clang


【解决方案1】:
  1. 使用'g++'不是使用clang,你应该使用'clang++'

  2. Gcc 不应该依赖于平台,但它可能是不同的版本

  3. 在任何情况下,您都应该显式包含所需的头文件,并且 std::filesystem 在“”中定义

  4. 关于需要添加“lstdc++fs” - 这是一个提示,实际上 g++ 版本不同并且使用不同的 llvm 版本。如https://en.cppreference.com/w/cpp/filesystem中所述

注意事项: 使用这个库可能需要额外的编译器/链接器选项。 GNU 9.1 之前的实现需要与 -lstdc++fs 链接,而 LLVM 9.0 之前的 LLVM 实现需要与 -lc++fs 链接

【讨论】:

  • 1) 你的意思是什么?在 macOS 中,当我键入 g++ 时,它会调用其默认编译器,即 clang 2) 是的……所以?在一种情况下,我使用 g++,在另一种情况下 3)这就是重点:为什么不在第一种情况下包含头文件,它仍然可以工作?但是你的句子不完整
  • 1.这可能是真的 2. 如果你使用不同版本的 GCC/CLANG,会有不同的行为,就像我在 (4) 中提到的那样,3. 有时不同的编译器和编译器版本在包含方面的行为有点不同 - 无论如何你应该显式包含标头。不客气!
  • 1.我查了一下:是这样的; 2)是的,这是我的第一个想法:但我想知道为什么它会这样工作。 cpp 参考的已知注释对我的情况没有帮助 3) 例如,如果在 macOS 中没有引发编译错误,我怎么知道何时必须包含该库?我的意思是,不尝试所有编译器......这就是我的问题所在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-10
  • 1970-01-01
  • 1970-01-01
  • 2012-01-31
  • 1970-01-01
  • 1970-01-01
  • 2015-12-25
相关资源
最近更新 更多