‘std::filesystem’ wurde nach dem Einbinden nicht deklariert

Lesezeit: 3 Minuten

Benutzer-Avatar
Sean

Ich habe viele Probleme mit dem Link des Dateisystems unter c ++ 17 überprüft und kann den Link immer noch nicht erfolgreich herstellen. Mein main.cpp Datei ist wie folgt.

#include <experimental/filesystem>


int main(int argc, char** argv)
{
    std::string imageDirectory = "./image";;
    std::vector<std::string> imagePath;

    for (const auto& entry: std::filesystem::directory_iterator(imageDirectory))
    {
        imagePath.push_back(entry.path());
        std::cout << entry.path() << std::endl;
    }

    return 0;
}

Mein CMakeLists.txt ist wie folgt.

cmake_minimum_required(VERSION 3.8 FATAL_ERROR)

project(visual_hull LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
add_library(dataIO
        STATIC
            dataIO.hpp
            dataIO.cpp)

find_package(OpenCV REQUIRED core highgui imgproc)

target_link_libraries(dataIO ${OpenCV_LIBS})

add_executable(visual_hull main.cpp)

target_link_libraries(visual_hull PUBLIC dataIO
                                         stdc++fs)

Der Fehler ist wie folgt.

/home/SENSETIME/zhangshunkang/Downloads/programming/c++/visual_hull/main.cpp: In function ‘int main(int, char**)’:
/home/SENSETIME/zhangshunkang/Downloads/programming/c++/visual_hull/main.cpp:15:31: error: ‘std::filesystem’ has not been declared
  for (const auto& entry: std::filesystem::directory_iterator(imageDirectory))
                               ^
CMakeFiles/visual_hull.dir/build.make:62: recipe for target 'CMakeFiles/visual_hull.dir/main.cpp.o' failed
make[2]: *** [CMakeFiles/visual_hull.dir/main.cpp.o] Error 1
CMakeFiles/Makefile2:72: recipe for target 'CMakeFiles/visual_hull.dir/all' failed
make[1]: *** [CMakeFiles/visual_hull.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

  • Welche Fehler erhalten Sie?

    – Angew ist nicht mehr stolz auf SO

    2. April 2019 um 12:23 Uhr

  • In C++17 sollte es so sein #include <filesystem> und wenn Sie verwenden clang++ oder g++ hinzufügen -lstdc++fs beim Kompilieren.

    – Ted Lyngmo

    2. April 2019 um 12:25 Uhr


  • @StaceyGirl Ich habe es versucht und ich habe den gleichen Fehler bekommen.

    – Sean

    2. April 2019 um 12:26 Uhr

  • @TedLyngmo Was ist mit dem cmake-Link?

    – Sean

    2. April 2019 um 12:27 Uhr

  • @ Sean Das ist kein Linker-Fehler. Das ist ein Compilerfehler.

    – Erorika

    2. April 2019 um 12:28 Uhr

Benutzer-Avatar
Ted Lyngmo

Es scheint, dass Ihr C++17-Compiler den Standard nicht enthält filesystem Header. Eine Möglichkeit, das zu umgehen:

#ifndef __has_include
  static_assert(false, "__has_include not supported");
#else
#  if __cplusplus >= 201703L && __has_include(<filesystem>)
#    include <filesystem>
     namespace fs = std::filesystem;
#  elif __has_include(<experimental/filesystem>)
#    include <experimental/filesystem>
     namespace fs = std::experimental::filesystem;
#  elif __has_include(<boost/filesystem.hpp>)
#    include <boost/filesystem.hpp>
     namespace fs = boost::filesystem;
#  endif
#endif

Dann benutze fs:: Anstatt von std::filesystem:: überall, überallhin, allerorts.

Überprüfung __cplusplus >= 201703L ist nur eine zusätzliche Vorsichtsmaßnahme, wenn Sie verwenden möchten filesystem bei Verwendung von C++11/14. In diesen Fällen __has_include(<filesystem>) vielleicht true aber einschließlich wird es nicht definieren std::filesystem Namensraum.

Benutzer-Avatar
Erorika

Sie nutzen std::filesystem::directory_iterator. std::filesystem::directory_iterator und den gesamten Namensraum std::filesystem werden im Header deklariert <filesystem>.

Sie haben die Kopfzeile nicht eingefügt <filesystem>. Stattdessen haben Sie eingeschlossen <experimental/filesystem>. Dieser Header deklariert nicht std::filesystem::directory_iterator. Stattdessen erklärt es std::experimental::filesystem::directory_iterator.

Sie können konsequent entweder die Standard-Dateisystembibliothek oder die experimentelle Dateisystembibliothek aus der technischen Spezifikation verwenden, aber Sie dürfen sie nicht miteinander mischen. Wenn Sie auf C++17 abzielen, sollten Sie verwenden <filesystem>.

Ich bekomme den Fehler, dass filesystem: No such file or directory

Die ideale Lösung besteht darin, Ihren Compiler auf eine Version zu aktualisieren, die nicht experimentelle Unterstützung für C++17 bietet. Verwenden Sie andernfalls den experimentellen TS oder Boost.

1015750cookie-check‘std::filesystem’ wurde nach dem Einbinden nicht deklariert

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy