- Ошибка в что не так с кодом?
- Решение
- Решение
- Problem adding std::filesystem to CMake Project
- EDIT 1
- EDIT 2
- EDIT 3
- 4 Answers 4
- `filesystem` с c ++ 17 не работает на моем Mac OS X High Sierra
- Решение
- Другие решения
- ‘std::filesystem’ has not been declared after including
- 2 Answers 2
- Привет, std::filesystem!
- Небольшой пост о больших возможностях C++17
- Как попробовать filesystem
- Конструирование путей и работа с кодировками
- Создание, удаление, переименование, копирование
- Рекурсивный и нерекурсивный обход каталогов
- Запрос метаинформации о файле
- Обработка symlink и hardlink
- Информация о свободном месте на диске
- Решена ли проблема 2038 года?
- Чего нет в filesystem?
- Что ещё почитать
Ошибка в что не так с кодом?
Помощь в написании контрольных, курсовых и дипломных работ здесь.
public class CustomMath < public static int multiply(int a, string b) < return a * b;.
🙁 Вот задание: Преобразовать массив Х по следующему правилу: все отрицательные элементы массива.
Что не так с кодом? ( пытаюсь понять, что не так? )
Есть исходный код. Hook, работает хорошо, но есть минус огромный — перестаёт писать в лог, при.
Вычислить значение циклической функции Функция: z=a cos(bt sin t)+c Изменение аргумента.
NaruTa, попробуй вот так
Решение
Оно может быть не полностью реализовано, даже если ms заявляет полную поддержку. Наличие заголовка ни о чём не говорит.
Возьми https://www.boost.org/doc/libs. /index.htm тогда, там почти тоже самое и с ms также работает.
Решение
Что не так с кодом?
Почему не работает этот код? Что не так? class Abonent(): def.
Страница входа в личный кабинет. При открытии в браузере выдает undefined должно быть: при.
Что то не так с кодом
Запускаю. Ввожу в edittext 01026071 и всё замечательно работает. Но если после запуска нажимаю на.
#include void main(int argc, char** argv) < int m; if (argc >1) m = argv; int*.
Задача из Прата: Выполните упражнение 4 из главы 9, но преобразуйте структуру Sales и.
Что не так? везде код пашет, на этой форме нет.Выкидывает значение парметра, а его не должно быть +.
Источник
Problem adding std::filesystem to CMake Project
I am new to CMake projects and I want to use the file system library in my project. I am running Ubuntu 18.04 with GCC 8.2 and CMake 3.13. In order to achieve this I tried two options:
Option 1
This does not help as the compiler still cannot find the file system library during compile time.
This does not help either as I get a CMake error which I don’t understand.
I feel out of my depth on this topic which is why I came here. I don’t mind putting extra work into finding out more but I don’t know anymore where to look. Any help would be appreciated!
EDIT 1
Thanks for the replies so far! I made Option 3 based on your feedback:
Sadly it doesn’t fix my problem. It still issues an error during compilation that it can’t find the compilation header.
EDIT 2
Thanks for all the replies so far. All of these help. I tried Ashkan his answer last (because it seemed intimidating). This one returns
Compiler is missing file system capabilities.
so I’m guessing something is wrong on that end. This is useful in the sense that I now know it’s probably not due to my CMake file. I now have to find out why the compiler does support the file system header though.
EDIT 3
Strictly speaking this question is answered because my question is about the CMake file. I am going to mark Ashkan his answer as the solution simply because it produced the next step in my troubleshooting search. If I could I would also mark lubgr his answer because I think that’s a really good answer as well. Thanks everyone!
4 Answers 4
Gcc 8.2. comes with , so there is no need to investigate with regard to the availability. Next, option 1 is sufficient, but needs a fix:
This should result in compiling the sources with -std=c++17 or -std=gnu++17 and adding -lstdc++fs when linking.
Edit: Note that as @Ashkan has pointed out in the comments, setting CMAKE_CXX_STANDARD_REQUIRED to true results in an immediate error at configure time if C++17 isn’t supported by the compiler, instead of a compilation error (due to the missing header) or at link time (due to the missing shared library). This might be desirable.
Besides from @lubgr’s answer. I think a more complete way is to also do try_compile to see that you can actually use the filesystem header. This in my opinion is better because some compilers are not supporting std::filesystem yet. Also in gcc 7.x you have the filesystem under experimental namespace. This way you can have a separate try_compile in the else clause and detect that.
Here is the related cmake for it
The file tests/has_filesystem.cc is very simple
You could in your else clause try_compile for boost::filesystem and pass a directive that can be used in your source file where you decide if you want to use c++17 filesystem or boost.
CHECK_CXX_SYMBOL_EXISTS takes three arguments, not two:
You forgot to tell CMake where to look for the symbols (the header that declares them).
I have found a case when try_compile was not enough: when using the Intel C++ compiler ( icpc (ICC) 19.1.1.216 20200306 ) in C++17 mode running on MacOS «Mojave» 10.14.6. The test program recommended by @Ashkan compiled without errors, and it even ran. However, my code uses fs::path::filename() at one point and that resulted in a runtime linker error ( dyld: lazy symbol binding failed: Symbol not found: ). In other words: the header is there, the implementation apparently isn’t (?). I didn’t investigate this any further.
The solution is to use try_run instead of try_compile and (in my case) fall back to boost::filesystem if std::filesystem is not yet supported.
Here is the relevant CMake code section:
Note that the variable RUNS_WITH_STDFS is not set to NO in case of failure but to «FAILED_TO_RUN» which is not interpreted as a FALSE Boolean (see CMake if() docs:
if() True if the constant is 1, ON, YES, TRUE, Y, or a non-zero number. False if the constant is 0, OFF, NO, FALSE, N, IGNORE, NOTFOUND, the empty string, or ends in the suffix -NOTFOUND.
so I had to string-compare its value.
The little test program also changed a bit compared to @Ashkan’s solution:
Источник
`filesystem` с c ++ 17 не работает на моем Mac OS X High Sierra
Я следую этому уроку:
оформить заказ на новый c ++ filesystem особенность. Однако я не могу собрать даже минимальный пример на моей машине:
Я использовал XCode, CLion и командную строку, пытаясь скомпилировать его, но ничего не работает, у меня есть Версия 9.3 (9E145) с (на вид правильными) настройками проекта, ни одна из которых не работает:
Вот мой CMakeLists.txt файл для CLion:
Вот вывод из > gxx —version :
Тем не менее это то, что я получаю в качестве вывода из моих IDE:
Что я делаю не так, мне кажется, что мой компилятор должен поддерживать c ++ 17?
редактировать
Согласно ответу Оуэна Моргана, я установил clang (фактическая команда установки была brew install llvm ) но сейчас жалуется на отсутствие string.h , Какие-нибудь мысли?
Решение
Компилятор, поставляемый с Xcode, поддерживает C ++ 17 язык функции, но не стандартные функции библиотеки C ++ 17. Посмотрев на скриншот, вы увидите, что стандартная поддержка библиотек достигает C ++ 11, и Apple еще не выпустила версию clang, которая поддерживает stdlib для C ++ 14 или C ++ 17.
Однако надежда не потеряна! Вы можете скачать новейшую версию clang из менеджера пакетов brew.
Затем вы можете скомпилировать, установив флаги компилятора cmake в свою собственную версию brew и затем запустив ее.
После установки llvm вам нужно будет связать ваш путь llvm с вашей текущей оболочкой. У меня есть сценарий оболочки, который я использую на работе для правильной настройки. Надеюсь это поможет.
Clang 6.0 не имеет включены в MacOS, но вы можете получить и ссылка против -lc++experimental и использовать std::experimental::filesystem вместо std::filesystem ,
Окончательный вызов командной строки:
Owen$ /usr/local/Cellar/llvm/6.0.0/bin/clang++ fs.cpp -std=c++1z -L /usr/local/Cellar/llvm/6.0.0/lib/ -lc++experimental
Другие решения
Если вы не хотите менять компилятор на использование std :: filesystem (потому что это больно), другой вариант — использовать Повысить файловую систему библиотека. Boost Filesystem была основой для std :: filesystem, поэтому для большинства применений она полностью совместима с std :: filesystem.
Настройка Boost довольно проста, если вы используете CMake. Просто brew install boost тогда в вашем CMakeLists.txt сделайте что-то вроде:
Я считаю, что дополнительная детализация в поиске Boost помогает подавить некоторые предупреждения, которые CMake иначе бросил бы на вас.
Тогда в вашем коде C ++:
Если вы чувствуете себя очень модно, вы можете использовать __has_include определить, чтобы проверить, доступна ли стандартная файловая система, и если да, установить namespace fs = std::filesystem и возврат к Boost, только если стандартная версия недоступна.
Источник
‘std::filesystem’ has not been declared after including
I have checked a lot of issues about the link of filesystem under c++17 and I still cannot make the link successfully. My main.cpp file is as the following.
My CMakeLists.txt is as the following.
The error is as the following.
2 Answers 2
It seems your C++17 compiler doesn’t include the standard filesystem header. One possible way to get around that:
Then use fs:: instead of std::filesystem:: everywhere.
Checking __cplusplus >= 201703L is just an extra precaution if you want to use filesystem when using C++11/14. In those cases, __has_include( ) may be true but including it will not define the std::filesystem namespace.
You use std::filesystem::directory_iterator . std::filesystem::directory_iterator and the entire namespace std::filesystem are declared in the header .
You haven’t included the header . Instead, you’ve included . This header does not declare std::filesystem::directory_iterator . Instead, it declares std::experimental::filesystem::directory_iterator .
You can consistently use either the standard filesystem library, or the experimental filesystem library from the technical specification, but you must not mix them together. If you’re targeting C++17, then you should use .
I will get the error that filesystem: No such file or directory
The ideal solution is to upgrade your compiler to a version that has non-experimental support for C++17. Otherwise use the experimental TS or Boost.
Источник
Привет, std::filesystem!
Небольшой пост о больших возможностях C++17
Jun 12, 2017 · 5 min read
Как попробовать filesystem
На момент написания поста, то есть в июне 2017 года, стандарт С++17 ещё не утверждён окончательно, поэтому пространство имён filesystem целиком находится в std::exprimental . Три ведущих компилятора уже реализовали filesystem:
- Для Visuals Studio данный модуль доступен начиная с VS2017, и не забудьте включить в своих проектах флаг “/std:c++latest”
- Для Clang/LLVM с библиотекой libc++ модуль также доступен, но не забудьте добавить к флагам компоновщика -lc++experimental -pthread , поскольку в этой реализации STL все экспериментальные возможности выделены в “libc++experimental.a”, а сама STL использует pthreads
- Для компилятора G++ из состава GCC версии 6.x и выше также потребуется флаг компоновщика: -lstdc++fs .
В любом случае, вам потребуется включать вплоть до окончательного вступления C++17 в силу.
Конструирование путей и работа с кодировками
Любой опытный программист знает о разнице в обработке путей между Windows и UNIX-системами:
- в Windows пути принимаются в виде UTF-16 строк, часто используемый тип wchar_t представляет 2-байтный символ в кодировке UTF-16, а разделителем путей служит обратный слеш “\”
- в UNIX пути принимаются в виде UTF-8 строк, редко используеый wchar_t представляет 4-байтный символ в кодировке UCS32, а разделителем путей служит прямой слеш “/”
Конечно же filesystem абстрагируется от подобных различий и позволяет легко работать как с платформо-зависимыми строками, так и с универсальным UTF-8. Для получения UTF-8 версии пути служит метод .u8string() .
Другие методы p a th и свободные функции позволяют конвертировать относительные пути в абсолютные и обратно, заменять расширение или имя файла, нормализовывать разделители к родному для ОС формату или получать “каноническое” представление пути.
Создание, удаление, переименование, копирование
Модуль filesystem предоставляет средства
- для проверки существования файла или каталога по заданному пути: fs::exists
- для создания каталога (даже если потребуется создать несколько вложенных каталогов, он с этим справится): fs::create_directories
- для удаления каталогов и файлов: fs::remove (удаляет файл или пустой каталог) и fs::remove_all (удаляет файл или рекурсивно удаляет каталог)
- для копирования и переименования каталогов и файлов средствами ОС, то есть с минимальными накладными расходами для приложения: fs::copy , fs::copy_file и fs::rename .
- для обрезания или увеличения размера файла (путём забивания нулями): fs::resize_file .
Все подобные операции могут завершиться с ошибкой не по вине программиста, а из-за отказа операционной системы: например, процессу не хватит прав для удаления каталога. В одних приложениях такая ошибка доступа приводит к срыву всей операции и должна порождать исключение, в других — это типичная ситуация, которую приложение должно быстро обработать, и желательно без исключений. Чтобы учесть интересы всех программистов, каждая операция над файлами и каталогами в filesystem имеет две версии:
- более простая версия выбрасывает исключение типа std::system_error при ошибке
- более сложная версия принимает дополнительный out-параметр типа std::error_code , в который в случае ошибки записывается код ошибки
Рекурсивный и нерекурсивный обход каталогов
До появления filesystem перечисление содержимого каталога в C++ было настоящей проблемой, решаемой чаще всего средствами нестандартного для C/C++ заголовка и ручной работы с циклами и списками.
В C++17 модуль filesystem предоставляет как рекурсивный, так и нерекурсивный итератор для доступа к содержимому каталога. С ним легко сочетаются любые алгоритмы из STL или Boost.Range. Ниже показан пример рекурсивного обхода каталога “data”:
Запрос метаинформации о файле
С помощью filesystem можно родными средствами ОС узнать метаинформацию о файле, например:
- определить размер файла, не читая его содержимое: fs::file_size
- прочитать или установить последнее время записи данных каким-либо процессом в заданный файл: fs::last_write_time
- прочитать или установить права доступа к файлу: fs::permissions
Обработка symlink и hardlink
В современных UNIX-системах и даже в Windows есть так называемые мягкие и жёсткие ссылки на файлы, расположенные в другом месте.
- Мягкие ссылки хранят в метаданных файловой системы оригинальный путь файла, из-за этого они могут становиться битыми, если оригинальный файл удалят
- Жёсткие ссылки позволяют одному файлу одновременно быть доступным по нескольким путям, при этом все пути равноправны, а файл не удаляется, пока число жёстких ссылок на него не упадёт до нуля. Есть ограничение: жёсткие ссылки на один и тот же файл должны находиться на одном и том же разделе диска.
Эти ссылки воспринимаются как настоящие файлы при работе с ними через обычные средства, такие как fopen или std::ifstream . Но иногда возникает нужда поработать именно со ссылкой, и ОС предоставляют такой API, а filesystem абстрагирует программиста от ОС. Ниже показан пример работы с мягкими ссылками:
Информация о свободном месте на диске
Глобальная функция fs::space возвращает объект типа fs::space_info , который описывает объём свободного места на носителе, на котором расположен указанный путь. Если передать несколько путей, находящихся на одном носителе, результат будет одинаковым.
Возвращаемый объект содержит три показателя, все в байтах:
- capacity — общий объём носителя
- free — объём свободного места
- available — объём места, доступного непривелигированным процессам; этот показатель меньше или равен free — например, в Linux система резервирует 5% места для пользователя root и размер available скорее всего будет меньше на 5% от capacity.
Так можно вывести информацию о свободном месте на диске, где находися текущий рабочий каталог:
Решена ли проблема 2038 года?
Тип данных time_t на большинстве платформ хранит число секунд с полуночи 1 января 1970 года (хотя по стандарту единица измерения времени в time_t не определена, почти все используют секунды). Если time_t остаётся 32-битным, то возникает проблема 2038 года: именно в этот год произойдёт переполнение time_t, и время в формате UNIX Timestamp уже нельзя будет представить в виде 32-битной переменной.
В Windows по умолчанию используется 64-битный time_t. В Linux, к сожалению, нет. Это означает, что вы никогда не должны использовать time_t в своём повседневном коде! Напишите для своего проекта простой класс для создания и хранения Timestamp или воспользуйтесь библиотечным, таким как класс Poco::Timestamp. Для взаимодействия со стандартной библиотекой используйте struct tm .
Проблема 2038 года не была решена в boost::filesystem — в нём дата модификации файла передавалась в виде time_t. К счастью, std::filesystem не имеет такого недостатка: для хранения времени используются типы данных из chrono . Посмотрите пример:
Чего нет в filesystem?
Хотя в filesystem есть большинство популярных операций, некоторые задачи могут потребовать использования внешних библиотек либо API операционной системы. Примеры задач, не решённых в filesystem:
- определить, что путь является путём к сетевому хранилищу, а не к локальному диску
- определить путь к каталогу, в котором находится исполняемый файл процесса либо библиотека .dll/.so, код которой сейчас выполняется
- прочитать всю метаинформацию о файле за один запрос к ОС, а не за несколько
Впрочем, для решения таких задач нетрудно один раз написать вспомогательный класс, интерфейс которого будет использовать классы из filesystem.
Что ещё почитать
При составлении статьи мной были прочитаны и переосмыслены несколько англоязычных статей:
Если вы захотите ещё больше погрузиться в нюансы filesystem, то я советую их прочитать.
Источник