首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用c++17的文件系统不能在我的mac os x High塞拉利昂上工作

使用c++17的文件系统不能在我的mac os x High塞拉利昂上工作
EN

Stack Overflow用户
提问于 2018-03-30 15:47:52
回答 3查看 16.2K关注 0票数 22

我正在学习本教程:

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

以签出新的c++ filesystem功能。然而,我无法在我的机器上编译哪怕是最小的示例:

代码语言:javascript
复制
#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;
}

我在试图编译XCode、CLion和命令行时使用了它,但是没有工作,我有9.3 (9E145)版本的项目设置(表面上是正确的),但这些设置都不起作用:

下面是我的CMakeLists.txt CLion文件:

代码语言:javascript
复制
cmake_minimum_required(VERSION 3.8)

project(FileSystem2)

set(CMAKE_CXX_STANDARD 17)

add_executable(FileSystem2 main.cpp)

以下是> gxx --version的输出

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

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

编辑

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

EN

回答 3

Stack Overflow用户

发布于 2018-04-01 16:30:53

Xcode附带的编译器支持C++17语言特性,但不支持C++17标准库特性。看你的截图,你会看到标准库支持上升到C++11,苹果还没有发布一个版本的clang,它支持stdlib支持C++14或C++17。

然而,希望不会失去!您可以从brew软件包管理器下载最新版本的clang。

代码语言:javascript
复制
brew install clang

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

下面是如何做到这一点的链接:http://antonmenshov.com/2017/09/09/clang-openmp-setup-in-xcode/

编辑:

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

代码语言:javascript
复制
#!/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:

Clang6.0还没有在<filesystem>中包含macOS,但是您可以获得<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>。无论如何,编译器命令行必须略有不同:

代码语言:javascript
复制
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

票数 18
EN

Stack Overflow用户

发布于 2018-04-01 23:02:19

如果您不想将编译器更改为使用std::filesystem (因为这很痛苦),另一种选择是使用Boost文件系统库。Boost文件系统是std::for系统的基础,因此在大多数使用中,它与std::for系统完全兼容。

如果使用CMake,设置Boost非常容易。只需brew install boost,然后在您的CMakeLists.txt中执行如下操作:

代码语言:javascript
复制
# 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++代码中:

代码语言:javascript
复制
#include <boost/filesystem.hpp>
namespace fs = boost::filesystem;

如果您觉得非常喜欢,可以使用__has_include定义来检查标准文件系统包含是否可用,如果是的话,只在std版本不可用的情况下,将namespace fs = std::filesystem和fallback设置为Boost。

票数 12
EN

Stack Overflow用户

发布于 2019-11-01 10:29:25

作为std::macOS对官方编译器和Xcode 11.1的文件系统支持,现在只限于Catalina/10.15部署目标和up,我想自己添加::文件系统作为附加选项。编写它是因为我想在macOS上使用std::文件系统,所以可能值得一试。

它是专为macOS、Linux和C++17提供的std::only系统的完全实现,从C++11到C++17,它试图保持接近标准。与boost相比,它的依赖性可能要小一些(如果您还没有使用它)。在最简单的形式中,只需删除源旁边的主头文件,包括filesystem.hpp,最后添加

代码语言:javascript
复制
namespace fs = ghc::filesystem;

并像使用std::like系统一样使用它。还可以通过使用附加的头文件将实现的部分分离到cpp中,自述解释了如何做到这一点。

备注:它是用utf8 8实现的--随处可见,但是有一个选项可以启用标准指定的std::wstring接口。与std::string_view相关的函数仅限于C++17,因为它不包括std::string_view的后端。

更多细节可以在api差异下的自述文件中找到。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49577343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档