Не получается использовать copy_file
Хотелось бы понять, почему данный код
#include <iostream>
#include <fstream>
#include <filesystem>
using namespace std;
int main(int argc, char* argv[]){
string pathfrm, pathto;
for(int i=0;i<argc;i++){
pathfrm=argv[1];
pathto=argv[2];
copy_file(pathfrm, pathto);
}
return 0;
}
дает ошибку еще на этапе интерпретации в редакторе
ошибка: use of undeclared identifier 'copy_file'
Тогда как в примере все вроде описано и разжевано и как бы программа должна работать.
Сделал все правильно как советовали. Ошибки в интерпретаторе пропали. Код красным не посвечивается, но программа не собирается так как ругается на ссылки experimental::flesystem.
Вот код:
#include <iostream>
#include <experimental/filesystem>
using namespace std;
int main(int argc, char* argv[])
{
string pathfrm, pathto;
for(int i=0;i<argc;i++){
pathfrm=argv[1];
pathto=argv[2];
std::experimental::filesystem::copy_file(pathfrm, pathto);
}
return 0;
}
Вот ошибки:
:-1: ошибка: main.o: in function
std::experimental::filesystem::v1::copy_file(std::experimental::filesystem::v1::__cxx11::path const&, std::experimental::filesystem::v1::__cxx11::path const&)': /usr/include/c++/10/experimental/bits/fs_ops.h:74: ошибка: undefined reference tostd::experimental::filesystem::v1::copy_file(std::experimental::filesystem::v1::__cxx11::path const&, std::experimental::filesystem::v1::__cxx11::path const&, std::experimental::filesystem::v1::copy_options)' :-1: ошибка: main.o: in functionstd::experimental::filesystem::v1::__cxx11::path::path<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::experimental::filesystem::v1::__cxx11::path>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)': :-1: ошибка: main.o: in functionstd::experimental::filesystem::v1::__cxx11::path::path<std::__cxx11::basic_string<char, std::char_traits, std::allocator >, std::experimental::filesystem::v1::__cxx11::path>(std::__cxx11::basic_string<char, std::char_traits, std::allocator > const&)': :-1: ошибка: collect2: error: ld returned 1 exit status
И программа, с таким количеством проблем, не работает. Не могу понять, что мне сделать. Я подозреваю, что компилятор себя неправильно ведет. Но не понимаю как все завести.
UPD: Нашел почему не работает filsystem - нужно было добавить флаг в .pro файл QMAKE_CXXFLAGS += -std=c++17 и пересобрать все.
Подробнее здесь
Но в моем случае все можно было сделать еще проще:
В терминале
c++ -std=c++17 /путь/к/файлу/main.cpp/моей/программы
UPD: В файле main.cpp добавил break; после операции копирования ибо если этого не сделать то по итогу программа будет делать копирование а дальше: "Аварийный останов. Стек памяти сброшен на диск".
Итоговый код программы такой:
#include <iostream>
#include <filesystem>
using namespace std;
int main(int argc, char* argv[])
{
string pathfrm, pathto;
for(int i=0;i<argc;i++){
pathfrm=argv[1];
pathto=argv[2];
std::filesystem::copy_file(pathfrm, pathto);
break;
}
return 0;
}
Ответы (3 шт):
#include <experimental/filesystem>
//...
std::experimental::filesystem::copy_file(pathfrm, pathto);
Итак. Все по полочкам. Если кто-то столкнется с таким.
Я использую qtcreator, qtcreator для компиляции консольных приложений без qt использует gcc системы(у меня это Fedora). У меня gcc версии 10.1.1.
В первую очередь необходимо добавить флаг в файл .pro в дереве файлов проекта. Содержимое файла не удалять, а лишь в строке
CONFIG += console c++1x //у меня вместо x было 11
x изменить на нужный вам стандарт c++. У меня эта строка стала выглядеть так
CONFIG += console c++17
И добавить в этот файл строку
QMAKE_CXXFLAGS += -std=c++1x
Где вместо x нужная вам.
У меня файл стал выглядеть вот так
TEMPLATE = app
CONFIG += console c++17
CONFIG -= app_bundle
CONFIG -= qt
QMAKE_CXXFLAGS += -std=c++17
SOURCES += \
main.cpp
Далее - пересобираем проект.
Если вам, как и мне, удобно работать в терминале linux, то можно вот так скомпилировать код(без использования qtcreator)
В терминале вводим:
cd
далее
c++ -std=c++17 /путь/к/файлу/main.cpp/в/котором/ваш/код //вместо 17 нужный вам стандарт
В папке /home/<name> будет создан файл a.out.
Если во время ввода команды компиляции вы будете в другой директории(например /home/<name>/Изоражения), то файл a.out будет создан в папке Изображения.
Файл a.out можно переименовать и запускать
./<name_of_a.out_file>
Либо переместить переименованный a.out файл в папку /bin с правами суперпользователя и запускать без ./
Либо просто запускать без переименования и без переноса:
./a.out <argument> <arument>