为什么 Xcode 11 beta 不能使用 C++17 的 <filesystem> 标头?

Hor*_*don 11 c++ macos xcode c++17

我需要为我的项目使用 C++ 17 的文件系统头文件。据我所知,Apple 终于在 Xcode 11 和 macOS Catalina 中提供了它。我使用的是最新的(beta 3)Xcode 11,我使用的是 macOS Catalina public beta 2,所以理论上它应该可以工作。但由于某种原因,它不是,Xcode 给出了如下错误:

'~path' is unavailable: introduced in macOS 10.15
Run Code Online (Sandbox Code Playgroud)

如果我将 Build Setting 中的 C++ 标准库从 libc++ 设置为 libstdc++,这些错误消息就会消失,我收到警告:

include path for stdlibc++ headers not found; pass '-stdlib=libc++' on the command line to use the libc++ standard library instead 
Run Code Online (Sandbox Code Playgroud)

以及在各种文件中缺少 iostream 和 cstddef 的大量错误。我该怎么做才能使文件系统工作?

编辑:一个最小的代码示例

#include <filesystem>
#include <iostream>
#include <string>

bool isPathDir(std::string pathString);

int main(int argc, char *argv[])
{
    std::string pathString = "../test.jpg";
    if (isPathDir(pathString)) {
        std::cout << "This is a directory!" << std::endl;
    } else {
        std::cout << "This is not a directory" << std::endl;
    }
}

bool isPathDir(std::string pathString)
{
    std::filesystem::path path(pathString);
    return std::filesystem::is_directory(path);
}
Run Code Online (Sandbox Code Playgroud)

Lou*_*nne 9

将我的评论提升为答案:

您是否碰巧有一个早于指定的 macOS 10.15 的后台部署目标?这将在您的命令行中显示为类似-mmacosx-version-min=<value>.

@LouisDionne 哦,是的,这就是问题所在!一旦我将部署目标设置为 10.15,代码就会完美构建!我以前从未听说过部署目标,非常感谢!

只是为了解释这里发生的事情,问题是<filesystem>仅在 Mac OS 10.15 中引入了对 的支持。当你使用时-mmacosx-version-min=XYZ,你告诉编译器你的程序应该能够在 Mac OS 的版本上一直运行,直到版本XYZ。如果您使用早于 10.15 的版本,我们会在编译时很好地告诉您不能使用<filesystem>,因为libc++.dylib如果您尝试在较旧的 Mac OS 版本上运行该程序,这将是一个运行时错误(可能是 缺少符号)超过 10.15。