c ++ 17的`filesystem`在我的Mac OS X High Sierra上不起作用 [英] `filesystem` with c++17 doesn't work on my mac os x high sierra

查看:358
本文介绍了c ++ 17的`filesystem`在我的Mac OS X High Sierra上不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在关注本教程:






这是我的CLion CMakeLists.txt 文件:

  cmake_minimum_required(版本3.8)

项目(FileSystem2)

set(CMAKE_CXX_STANDARD 17)

add_executable(FileSystem2 main.cpp)

此处是>的输出; gxx --version





尽管如此,这是我从IDE中获得的输出:







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






编辑



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

解决方案

Xcode附带的编译器支持C ++ 17 语言功能,但不支持C ++ 17标准库功能。查看您的屏幕截图,您会看到标准库对C ++ 11的支持,并且Apple尚未发布具有对C ++ 14或C ++ 17的stdlib支持的clang版本。



但是,希望并没有失去!您可以从Brew软件包管理器中下载最新版本的clang。

  brew install clang 

然后,您可以通过将cmake编译器标志设置为自定义Brew版本并运行它来进行编译。



此处是如何执行此操作的链接: http://antonmenshov.com/2017/09/09/clang-openmp-setup-in-xcode/



编辑:



安装 llvm 后,您需要将llvm路径链接到当前shell中。我有一个shell脚本,可以在工作中使用它来正确设置此设置。希望对您有所帮助。

 #!/ bin / bash 
brew更新
brew安装--with-工具链llvm#llvm,但是带有所有标题
xcode-select --install#安装您可能正在模仿的其他标题。
echo‘export PATH = / usr / local / opt / llvm / bin:$ PATH’>> 〜/ .bash_profile#将自定义llvm路径导出到外壳
sudo ln -s / usr / local / opt / llvm / bin / clang ++ / usr / local / bin / clang ++-brew#可选,但我喜欢符号链接集。

编辑2:



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



最终命令行调用:



Owen $ /usr/local/Cellar/llvm/6.0.0/bin/clang++ fs.cpp -std = c ++ 1z -L /usr/local/Cellar/llvm/6.0.0/lib/- lc ++ experimental



编辑3:



当前的clang版本7.0.1支持< filesystem> < experimental / filesystem> 。无论如何,编译器命令行必须稍有不同:

  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 ++ experimental
(可选),您可以将 -std = c ++ 1z 替换为 -std = c ++ 17 以及。


I'm following this tutorial:

http://www.bfilipek.com/2017/08/cpp17-details-filesystem.html

to checkout new c++ filesystem feature. However I'm unable to compile even minimal example on my machine:

#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;
}

I was using XCode, CLion and command line while trying to compile it but nothing works, I have Version 9.3 (9E145) with (seemingly proper) project settings, none of which work:

Here is my CMakeLists.txt file for CLion:

cmake_minimum_required(VERSION 3.8)

project(FileSystem2)

set(CMAKE_CXX_STANDARD 17)

add_executable(FileSystem2 main.cpp)

Here is an output from > gxx --version:

Nevertheless this is what I get as an output from my IDEs:

What am I doing wrong, it looks to me that my compiler should support c++17?


Edit

As per Owen Morgan's answer I've installed clang (actual install command was brew install llvm) but it now complains about absence of string.h. Any thoughts?

解决方案

The compiler shipped with Xcode supports C++17 language features but not C++17 standard library features. Looking at your screenshot you will see the standard library support goes up to C++11, and Apple has not yet shipped a version of clang that has stdlib support for either C++14 or C++17.

However hope is not lost! You can download the newest version of clang from the brew package manager.

brew install clang

Then you can compile by setting your cmake compiler flags to be your custom brew version and then running that.

Here is a link how to do that: http://antonmenshov.com/2017/09/09/clang-openmp-setup-in-xcode/

Edit:

After installing llvm you will need to link your llvm path into your current shell. I have a shell script that I use at work to get this set up properly. Hope this helps.

#!/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.

Edit 2:

Clang 6.0 doesn't have <filesystem> included on macOS yet, however you can get <experimental/filesystem>, and link against -lc++experimental, and use std::experimental::filesystem instead of std::filesystem.

Final command line invocation:

Owen$ /usr/local/Cellar/llvm/6.0.0/bin/clang++ fs.cpp -std=c++1z -L /usr/local/Cellar/llvm/6.0.0/lib/ -lc++experimental

Edit 3:

Current clang version 7.0.1 supports either <filesystem> or <experimental/filesystem>. In any case, the compiler command line must be slightly different:

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

with -lc++fs instead of -lc++experimental. Optionally, you can replace-std=c++1z with -std=c++17 as well.

这篇关于c ++ 17的`filesystem`在我的Mac OS X High Sierra上不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆