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.
注意:这不会失败 #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.