C++ `文件系统`带有c++;17不';我不能在mac os x high sierra上工作

C++ `文件系统`带有c++;17不';我不能在mac os x high sierra上工作,c++,xcode,ide,c++17,C++,Xcode,Ide,C++17,我将遵循本教程: < >检查新的C++代码>文件系统< /代码>特性。但是,我无法在我的机器上编译哪怕是最小的示例: #include <string> #include <iostream> #include <filesystem> namespace fs = std::filesystem; int main() { std::string path = "/"; for (auto & p : fs::director

我将遵循本教程:

< >检查新的C++代码>文件系统< /代码>特性。但是,我无法在我的机器上编译哪怕是最小的示例:

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

namespace fs = std::filesystem;

int main()
{
    std::string path = "/";

    for (auto & p : fs::directory_iterator(path))
        std::cout << p << std::endl;
}
以下是gxx的输出--version:

然而,这是我从IDE中得到的输出:

我做错了什么,在我看来,我的编译器应该支持c++17


编辑


根据Owen Morgan的回答,我已经安装了clang(实际安装命令是
brew install llvm
),但它现在抱怨缺少
string.h
。有什么想法吗

Xcode附带的编译器支持C++17语言功能,但不支持C++17标准库功能。看看你的屏幕截图,你会看到标准库支持升级到了C++11,而苹果还没有发布一个支持C++14或C++17标准库的clang版本

然而,希望并没有丧失!您可以从brew软件包管理器下载最新版本的clang

brew install clang
然后,您可以通过将cmake编译器标志设置为自定义brew版本,然后运行该版本进行编译

以下是如何做到这一点的链接:

编辑:

安装
llvm
后,需要将llvm路径链接到当前shell中。我有一个shell脚本,我在工作中使用它来正确地进行设置。希望这有帮助

#!/bin/bash
brew update
brew install --with-toolchain llvm # llvm but with all the headers
xcode-select --install # installs additional headers that you might be mimssing.
echo 'export PATH="/usr/local/opt/llvm/bin:$PATH"' >> ~/.bash_profile # exports the custom llvm path into the shell 
sudo ln -s /usr/local/opt/llvm/bin/clang++ /usr/local/bin/clang++-brew # optional but I like to have a symlink set.
编辑2:

Clang 6.0尚未在macOS上包含
,但是您可以获得
,并链接到
-lc++experimental
,使用
std::experimental::filesystem
而不是
std::filesystem

最终命令行调用:

Owen$/usr/local/cillar/llvm/6.0.0/bin/clang++fs.cpp-std=c++1z-L/usr/local/cillar/llvm/6.0.0/lib/-lc++实验版

编辑3:

当前的clang版本7.0.1支持
。在任何情况下,编译器命令行都必须略有不同:

Owen$ /usr/local/Cellar/llvm/7.0.1/bin/clang++ main.cpp -std=c++1z -L /usr/local/Cellar/llvm/7.0.1/lib/ -lc++fs
使用
-lc++fs
而不是
-lc++实验

或者,您也可以将
-std=c++1z
替换为
-std=c++17

如果您不想将编译器更改为使用std::filesystem(因为这很麻烦),另一种选择是使用库。Boost文件系统是std::Filesystem的基础,因此对于大多数应用来说,它与std::Filesystem完全兼容

如果您使用的是CMake,那么设置Boost非常简单。只需
brew安装boost
,然后在CMakeLists.txt中执行以下操作:

# Boost
set(boost_min_ver 1.50.0)
set(boost_libs system filesystem)
find_package(Boost ${boost_min_ver})

if(Boost_FOUND)
    find_package(Boost ${boost_min_ver} COMPONENTS ${boost_libs})
endif()

target_link_libraries(your_target ${Boost_LIBRARIES})
我发现,查找Boost时的额外冗长有助于抑制CMake可能会向您发出的一些警告

<>你的C++代码:

#include <boost/filesystem.hpp>
namespace fs = boost::filesystem;
#包括
名称空间fs=boost::filesystem;

如果您觉得非常新奇,可以使用
\u has\u include
define检查标准文件系统include是否可用,如果可用,设置
namespace fs=std::filesystem
,只有在std版本不可用时才回退到Boost。

由于macOS上使用官方编译器和Xcode 11.1对std::filesystem的支持现在仅限于Catalina/10.15部署目标及以上,我想谦恭地添加一个附加选项。编写它是因为我想在macOS上使用std::filesystem,所以可能值得一试

它是针对macOS、Linux和Windows的std::filesystem的完整实现,仅具有头文件功能,从C++11到C++17都可以使用,并且它试图保持接近标准。它的依赖性可能比boost轻(如果您还没有使用它的话)。在最简单的形式中,只需将主头文件放在源文件旁边,include filesystem.hpp,最终添加

namespace fs = ghc::filesystem;
并像使用std::filesystem一样使用它。通过使用附加的头文件,也可以将部分实现分离到cpp中,自述文件解释了如何做到这一点

注意:它在任何地方都是使用utf8实现的,但是有一个选项可以按照标准的规定在Windows上启用std::wstring接口。与std::string_视图相关的函数仅限于C++17,因为它不包括std::string_视图的后端口。

更多详细信息可以在自述文件中找到。

这不起作用<代码>没有名为“clang”的可用公式它是llvm。
namespace fs = ghc::filesystem;