Как использовать std :: filesystem на gcc 8?

Я обновил версию gcc, gcc --version дает следующий результат

    gcc (Ubuntu 8.1.0-5ubuntu1~16.04) 8.1.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

я могу включить файловую систему в файл заголовка без каких-либо ошибок

#include<filesystem>

Но когда я пытаюсь получить доступ к файловой системе пространства имен, как показано ниже, я получаю сообщение об ошибке

namespace fs = std::filesystem;

Сообщение об ошибке

error: ‘filesystem’ is not a namespace-name
 namespace fs = std::filesystem;

Это кажется странным, поскольку gcc 8 поддерживает std :: filesystem и недоступен в пространстве имен. Я делаю что-то не так при доступе к std :: filesystem?

и да, я построил с -std = C++ 17

Вы собираете с помощью -std=c++17 (в конце концов, это функция C++ 17)?

Some programmer dude 08.11.2018 06:28

Вы компилируете с -std=c++17 или -std=gnu++17?

Shawn 08.11.2018 06:29

да, я построил с -std = C++ 17

Naveen 08.11.2018 06:31

Возможно актуально: stackoverflow.com/questions/45867379/…

Tas 08.11.2018 06:32

@ Так как это было о gcc v7, gcc v8 уже поддерживает std :: filesystem

Naveen 08.11.2018 06:33

Пришло время создать Минимальный, полный и проверяемый пример, чтобы показать нам. А также покажите нам, как вы строите исходный код.

Some programmer dude 08.11.2018 18:08
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
16
6
11 665
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Добавьте библиотеку файловой системы в качестве аргумента вашего компилятора, который будет перенаправлен компоновщику. Также убедитесь, что вы используете C++ 17. И g ++, и clang ++ принимают этот конкретный формат:

--std=c++17 -lstdc++fs

это не сработало, я случайно удалил строку пространства имен, когда я сделал предыдущий ответ, но все равно получаю ту же ошибку.

Naveen 08.11.2018 06:43

Что ж, связывание, вероятно, сработает, но вы заблокированы проблемами, которые даже не зайдут так далеко. Попробуйте несколько примеров файловой системы на std :: filesystem @ cppreference, и если это не сработает, просто отредактируйте вопрос.

Ted Lyngmo 08.11.2018 06:48

@Naveen Вы когда-нибудь выясняли, что случилось? Этот старый ответ по-прежнему получает положительные голоса, поэтому кажется, что он помогает другим :-)

Ted Lyngmo 11.06.2020 11:10

К сожалению, нет, ни одно из решений не помогло, после этого я перестал программировать на C++ :-)

Naveen 11.06.2020 17:34

@Naveen :-D О нет, это прискорбно. Возможно, вам будет приятно узнать, что с тех пор статус компиляторов значительно улучшился, и я уверен, что мы сможем решить это, если вы дадите C++ еще один шанс :-)

Ted Lyngmo 11.06.2020 17:37

Если это не сработает, убедитесь, что вы ставите -lstdc++fs после имен входных файлов, и убедитесь, что ваш gcc достаточно новый (gcc --version).

serg06 31.07.2020 22:03
--std=c++17 по-прежнему необходим для использования частей <filesystem> в gcc 9.3.0 (это версия, которую поддерживает Ubuntu 20.04), и реализация все еще не завершена. Я был удивлен, что даже через 3 года ситуация все еще остается немного сложной. Поскольку мне нужна всего пара вещей из <filesystem>, я рассматриваю возможность использования других вариантов (даже тех, которые менее переносимы и могут потребовать другой реализации для Windows).
jrh 21.08.2020 20:51

@jrh --std=c++17 или --std=c++<any version after c++17> будут необходимы до тех пор, пока C++ 17 или более поздняя версия не является версией по умолчанию, которую использует компилятор, так что это неудивительно. Какая часть реализации <filesystem> не завершена в g ++?

Ted Lyngmo 23.08.2020 10:24

@TedLyngmo Сообщение, которое я прочитал, в котором упоминалось, что <filesystem> был неполным, я думаю, устарел. страница поддержки стандартов g ++, кажется, говорит, что C++ 17 имеет «почти полную поддержку». Возможно, неудивительно, что C++ 17 еще не был завершен в 2019 году, возможно, gcc всегда нуждался в когда-то для реализации последнего стандарта в компиляторе. Тем не менее, это застало меня врасплох.

jrh 23.08.2020 16:42

Кроме того, VS2013 имеет ограниченную поддержку C++ 11, но (что довольно сбивает с толку), он, похоже, использует противоположную стратегию и предлагает вам использовать выбранные ими особенности C++ 11, если вы явно не говорите, что хотите использовать определенный C++. стандарт. FWIW стратегия VS 2013 более раздражает в 2020 году.

jrh 23.08.2020 16:48

@jrh Поддержка языка C++ 17 не может быть 100%, но важно состояние стандартной реализации библиотека. Кажется, что в gcc 8 есть несоответствующие перегрузки пути basic_fstream, но я не уверен, так ли это в gcc 9 или новее.

Ted Lyngmo 23.08.2020 18:22

несмотря на то, что больше не нужен, кажется обратно совместимым и также работает с gcc9.

Croc Dialer 29.05.2021 19:17

@CrocDialer Люди, использующие LTS OS: es, все еще могут наткнуться на это.

Ted Lyngmo 29.05.2021 22:47

Если вы используете IDE, например, кодовые блоки, убедитесь, что установлены флаги компилятора по умолчанию для gcc: -std = C++ 17, а не только для текущего проекта, но и для глобальных флагов.

Если бы эта проблема с CB и установка этого флага в [Настройки / Компилятор] исправили ее (нет необходимости добавлять библиотеку)

Because of the silly rep system, I can't make this a comment on slashmais's answer.

При использовании IDE убедитесь, что вы также установили компилятор для использования в GCC8 или выше.

В моем случае, несмотря на то, что CodeLite был установлен, он использовал более низкую версию GCC и вызывал головную боль (re: не находил заголовок)!

Ручная настройка CodeLite на использование gcc-8 (вместо gcc эта проблема решена.

За сокращение жалкого переходного периода ниже 100, который мы все ненавидели. ;)

Sz. 31.07.2019 23:32

Другие вопросы по теме