c ++ 17的`filesystem`在我的Mac OS X High Sierra上不起作用 [英] `filesystem` with c++17 doesn't work on my 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屋!