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:
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
:
Das erhalte ich jedoch als Ergebnis meiner IDEs:
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?
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.
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.