我需要为我的项目使用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);
}
答案 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版本上运行该程序。