#c #cmake #c 17
#c #cmake #c 17
Вопрос:
Я проверил множество вопросов о ссылке на файловую систему в c 17, и я все еще не могу успешно создать ссылку. Мой main.cpp
файл выглядит следующим образом.
#include <experimental/filesystem>
int main(int argc, char** argv)
{
std::string imageDirectory = "./image";;
std::vector<std::string> imagePath;
for (const autoamp; 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 autoamp; 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
Комментарии:
1. Какие ошибки вы получаете?
2. В C 17 это должно быть,
#include <filesystem>
и если вы используетеclang
илиg
add-lstdc fs
при компиляции.3. @StaceyGirl Я попробовал это, и я получил ту же ошибку.
4. @TedLyngmo Что насчет ссылки cmake?
5. @Sean Это не ошибка компоновщика. Это ошибка компилятора.
Ответ №1:
Похоже, ваш компилятор C 17 не включает стандартный filesystem
заголовок. Один из возможных способов обойти это:
#ifndef __has_include
static_assert(false, "__has_include not supported");
#else
# if __cplusplus >= 201703L amp;amp; __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::
везде.
Проверка __cplusplus >= 201703L
— это просто дополнительная мера предосторожности, если вы хотите использовать filesystem
при использовании C 11/14. В этих случаях __has_include(<filesystem>)
может быть true
, но его включение не будет определять std::filesystem
пространство имен.
Ответ №2:
Вы используете std::filesystem::directory_iterator
. std::filesystem::directory_iterator
и все пространство имен std::filesystem
объявлены в заголовке <filesystem>
.
Вы не включили заголовок <filesystem>
. Вместо этого вы включили <experimental/filesystem>
. Этот заголовок не объявляется std::filesystem::directory_iterator
. Вместо этого он объявляет std::experimental::filesystem::directory_iterator
.
Вы можете последовательно использовать либо стандартную библиотеку файловой системы, либо экспериментальную библиотеку файловой системы из технической спецификации, но вы не должны смешивать их вместе. Если вы ориентируетесь на C 17, то вам следует использовать <filesystem>
.
Я получу сообщение об ошибке, что файловая система: нет такого файла или каталога
Идеальным решением является обновление вашего компилятора до версии, которая имеет неэкспериментальную поддержку C 17. В противном случае используйте экспериментальный TS или Boost.
Ответ №3:
Cpp 17 не понимает стандартную библиотеку.
В Cmake.txt добавить:
set (CMAKE_CXX_FLAGS "-lstdc fs -std=c 17")