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

时间:2019-07-07 18:13:14

标签: c++ xcode macos c++17

我需要为我的项目使用C ++ 17的文件系统标头。据我所知,Apple最终将其与Xcode 11和macOS Catalina一起使用。我使用的是最新的(测试版3)Xcode 11,我使用的是macOS Catalina公共测试版2,因此从理论上讲它应该可以工作。但是由于某种原因,它不是,并且Xcode会给出如下错误:

'~path' is unavailable: introduced in macOS 10.15

如果我在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 

以及各种文件中缺少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);
}

1 个答案:

答案 0 :(得分:1)

将我的评论提升为答案:

  
    

您是否碰巧指定了比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中可能缺少符号)在10.15之前的Mac OS版本上运行该程序。