我已经检查了有关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;
}
Run Code Online (Sandbox Code Playgroud)
我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)
Run Code Online (Sandbox Code Playgroud)
错误如下。
/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
Run Code Online (Sandbox Code Playgroud)
你用std::filesystem::directory_iterator。std::filesystem::directory_iterator整个命名空间std::filesystem都在 header 中声明<filesystem>。
您还没有包含标题<filesystem>。相反,您已经包含了<experimental/filesystem>. 该标头未声明std::filesystem::directory_iterator. 相反,它声明std::experimental::filesystem::directory_iterator.
您可以一致使用标准文件系统库或技术规范中的实验文件系统库,但不得将它们混合在一起。如果您的目标是 C++17,那么您应该使用<filesystem>.
我会收到文件系统错误:没有这样的文件或目录
理想的解决方案是将编译器升级到对 C++17 有非实验支持的版本。否则使用实验性 TS 或 Boost。
小智 6
Cpp 17 不理解标准库。
在Cmake.txt中添加:
set (CMAKE_CXX_FLAGS "-lstdc++fs -std=c++17")
Run Code Online (Sandbox Code Playgroud)
看来您的C ++ 17编译器不包含标准filesystem标头。解决该问题的一种可能方法:
#ifndef __has_include
static_assert(false, "__has_include not supported");
#else
# if __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
Run Code Online (Sandbox Code Playgroud)
然后fs::在std::filesystem::所有地方使用代替。