webentwicklung-frage-antwort-db.com.de

`filesystem` mit c ++ 17 funktioniert nicht auf meinem Mac OS X High Sierra

Ich folge diesem Tutorial:

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

neue c ++ filesystem -Funktion auschecken. Ich kann jedoch nicht einmal ein minimales Beispiel auf meinem Computer kompilieren:

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

Ich habe XCode, CLion und die Befehlszeile verwendet, als ich versuchte, es zu kompilieren, aber nichts funktioniert. Ich habe Version 9.3 (9E145) mit (anscheinend richtigen) Projekteinstellungen, von denen keine funktioniert:

enter image description hereenter image description here

Hier ist mein CMakeLists.txt Datei für CLion:

cmake_minimum_required(VERSION 3.8)

project(FileSystem2)

set(CMAKE_CXX_STANDARD 17)

add_executable(FileSystem2 main.cpp)

Hier ist eine Ausgabe von > gxx --version:

enter image description here

Das erhalte ich jedoch als Ergebnis meiner IDEs:

enter image description hereenter image description hereenter image description here

Was mache ich falsch, scheint mir, dass mein Compiler C++ 17 unterstützen sollte?


Bearbeiten

Laut Owen Morgans Antwort habe ich clang installiert (der eigentliche Installationsbefehl war brew install llvm) aber es beklagt sich jetzt über das Fehlen von string.h. Irgendwelche Gedanken?

17
Lu4

Der mit Xcode gelieferte Compiler unterstützt C++ 17 Sprachfunktionen , jedoch keine C++ 17-Standardbibliotheksfunktionen. Wenn Sie sich Ihren Screenshot ansehen, werden Sie feststellen, dass die Standardbibliotheksunterstützung bis C++ 11 reicht und Apple hat noch keine Version von clang ausgeliefert, die stdlib-Unterstützung für C++ 14 oder C bietet ++ 17.

Die Hoffnung geht jedoch nicht verloren! Sie können die neueste Version von clang vom Brew Package Manager herunterladen.

brew install clang

Dann können Sie kompilieren, indem Sie Ihre cmake-Compiler-Flags auf Ihre benutzerdefinierte Brühversion setzen und diese dann ausführen.

Hier ist ein Link, wie das geht: http://antonmenshov.com/2017/09/09/clang-openmp-setup-in-xcode/

Bearbeiten:

Nach der Installation von llvm müssen Sie Ihren llvm-Pfad mit Ihrer aktuellen Shell verknüpfen. Ich habe ein Shell-Skript, das ich bei der Arbeit verwende, um dieses richtig einzurichten. Hoffe das hilft.

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

Bearbeiten 2:

Clang 6.0 hat kein <filesystem> ist noch auf macOS enthalten, aber Sie können <experimental/filesystem> und Link gegen -lc++experimental und benutze std::experimental::filesystem Anstatt von std::filesystem.

Letzter Aufruf der Kommandozeile:

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:

Die aktuelle Clang-Version 7.0.1 unterstützt entweder <filesystem> oder <experimental/filesystem>. In jedem Fall muss die Compiler-Befehlszeile etwas anders sein:

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

mit -lc++fs Anstatt von -lc++experimental. Optional können Sie ersetzen-std=c++1z mit -std=c++17 auch.

14
Owen Morgan

Wenn Sie den Compiler nicht so ändern möchten, dass er das Dateisystem std :: verwendet (da dies schmerzhaft ist), können Sie auch die Bibliothek Boost Filesystem verwenden. Boost Filesystem war die Basis für std :: filesystem, daher ist es für die meisten Anwendungen vollständig kompatibel mit std :: filesystem.

Boost einzurichten ist ziemlich einfach, wenn Sie CMake verwenden. Einfach brew install boost Und dann in deiner CMakeLists.txt etwas machen wie:

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

Die zusätzliche Ausführlichkeit beim Auffinden von Boost hilft, wie ich finde, einige Warnungen zu unterdrücken, die CMake sonst auf Sie werfen würde.

Dann in deinem C++ Code:

#include <boost/filesystem.hpp>
namespace fs = boost::filesystem;

Wenn Sie sich sehr ausgefallen fühlen, können Sie mit der Definition __has_include Prüfen, ob das Standard-Dateisystem-Include verfügbar ist, und in diesem Fall namespace fs = std::filesystem Und Fallback auf Boost setzen, wenn die Standardversion nicht verfügbar ist nicht verfügbar.

8
aiusepsi