Mac 无法识别 C++ 文件系统库

Mac c++ filesystem library not recognized

注意:这不会失败 #include <filesystem>。之后失败了。

我在 macOS 10.15 上,使用 clang 11。clang --version 的输出:

Apple clang version 11.0.0 (clang-1100.0.33.17)
Target: x86_64-apple-darwin19.4.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

当我尝试编译一些简单的东西时:

#include <filesystem>

using namespace std;

filesystem::path dev_dir;

int main() {
    dev_dir = "/dev/";
    return 0;
}

编译器确实找到文件系统库,但识别命名空间:

$clang trigger_controller.cpp -o trigger_controller

trigger_controller.cpp:##:##: error: use of undeclared identifier 'filesystem'
filesystem::path dev_dir;

这是我想包含的文件(我已确认存在):

// /usr/local/include/c++/9.2.0/filesystem

#ifndef _GLIBCXX_FILESYSTEM
#define _GLIBCXX_FILESYSTEM 1

#pragma GCC system_header

#if __cplusplus >= 201703L

#include <bits/fs_fwd.h>
#include <bits/fs_path.h>
#include <bits/fs_dir.h>
#include <bits/fs_ops.h>

#define __cpp_lib_filesystem 201703

#endif // C++17

#endif // _GLIBCXX_FILESYSTEM

我做错了什么?我需要特定的编译器选项吗?命名空间错误吗?

是的,您需要特定的编译器选项。请注意,此 header 的全部内容,除了样板文件外,都包含在 #if __cplusplus >= 201703L ... #endif 块中。这意味着 header 实际上是空的,除非编译器声明符合 2017 版 C++ 标准(或更高版本)。

对于 clang 和 gcc,标准一致性级别由命令行选项 -std 控制。 GCC 对此选项的文档是 here;我不知道在哪里可以找到 clang 的文档,但 clang 通常会尝试 command-line 与 gcc 兼容,因此相同的选项应该有效。

在这种情况下,对于 C++ 2017,您应该使用的确切选项是 -std=gnu++17。在撰写本文时,对 C++ 标准的更新版本的支持仍然是 "experimental" 和 "will almost certainly change in incompatible ways",所以我会避免它。我还建议您避免使用此模式的超一致性变体 -std=c++17,因为它很有可能会暴露 MacOS 系统中的错误 headers.