cmake 在包含〈experimental/filesystem>之后尚未声明“std::filesystem "

djmepvbi  于 2022-11-11  发布在  其他
关注(0)|答案(3)|浏览(507)

我已经检查了很多关于c++17下文件系统链接的问题,但仍然无法成功链接。我的main.cpp文件如下。


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

我的CMakeLists.txt如下。

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)

错误如下所示。

/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
ssgvzors

ssgvzors1#

看起来你的C++17编译器没有包含标准的filesystem头文件。一个可能的解决方法是:


# 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

然后在所有地方都使用fs::而不是std::filesystem::
如果你在使用C++11/14时想使用filesystem,选中__cplusplus >= 201703L只是一个额外的预防措施。在这些情况下,__has_include(<filesystem>)可能是true,但包括它将不会定义std::filesystem命名空间。

rt4zxlrg

rt4zxlrg2#

我们使用std::filesystem::directory_iteratorstd::filesystem::directory_iterator和整个命名空间std::filesystem都在头文件<filesystem>中声明。
你没有包含头文件<filesystem>,而是包含了<experimental/filesystem>。这个头文件没有声明std::filesystem::directory_iterator,而是声明了std::experimental::filesystem::directory_iterator
你可以使用标准文件系统库,也可以使用技术规范中的实验文件系统库,但是不能混合使用。如果你的目标是C17,那么你应该使用<filesystem>
我将得到文件系统错误:没有这样的文件或目录
理想的解决方案是将您的编译器升级到对C
17具有非实验性支持的版本。否则,请使用实验性TS或Boost。

im9ewurl

im9ewurl3#

Cpp 17不理解标准库。
在Cmake.txt中添加:

set (CMAKE_CXX_FLAGS "-lstdc++fs -std=c++17")

相关问题