Почему бета-версия Xcode 11 не может использовать заголовок <filesystem> С++ 17?

Мне нужно использовать заголовок файловой системы С++ 17 для моего проекта. Насколько я знаю, Apple наконец сделала его доступным с Xcode 11 и с macOS Catalina. Я использую последнюю (бета-версия 3) Xcode 11 и общедоступную бета-версию 2 macOS Catalina, поэтому теоретически это должно работать. Но почему-то это не так, и Xcode выдает такие ошибки, как:

'~path' is unavailable: introduced in macOS 10.15

Если я установил стандартную библиотеку C++ в настройках сборки на libstdc++ из libc++, эти сообщения об ошибках исчезли, и я получил предупреждение:

include path for stdlibc++ headers not found; pass '-stdlib=libc++' on the command line to use the libc++ standard library instead 

и куча ошибок с отсутствующими iostream и cstddef в разных файлах. Что я могу сделать, чтобы файловая система работала?

Обновлено: минимальный пример кода

#include <filesystem>
#include <iostream>
#include <string>

bool isPathDir(std::string pathString);

int main(int argc, char *argv[])
{
    std::string pathString = "../test.jpg";
    if (isPathDir(pathString)) {
        std::cout << "This is a directory!" << std::endl;
    } else {
        std::cout << "This is not a directory" << std::endl;
    }
}

bool isPathDir(std::string pathString)
{
    std::filesystem::path path(pathString);
    return std::filesystem::is_directory(path);
}

У вас есть минимальный воспроизводимый пример, который не работает, и вы можете нам его показать? Как вы создавали свой проект? Возможно, вам нужно добавить флаги (явно или через переключатель), чтобы включить C++17?

Some programmer dude 07.07.2019 20:22

@Someprogrammerdude Я добавил простой пример кода. Я настроил этот проект как приложение командной строки и добавил к нему библиотеки GoogleTest и OpenCV с некоторыми специфическими флагами opencv.

Hordon 07.07.2019 20:39

@DonátHorváth «Фрагмент кода» — это большая разница из минимальный воспроизводимый пример, что и было запрошено.

Jesper Juhl 07.07.2019 20:47

Насколько мне известно, Apple больше не поставляет libstdc++ с Mac OS; так что это действительно не должно быть выбором в Xcode. Я дам знать людям в Apple. Но это не ответ на ваш вопрос.

Marshall Clow 07.07.2019 21:04

@JesperJuhl Достаточно честно, обновил фрагмент!

Hordon 07.07.2019 21:10

@MarshallClow О, это ответ на часть «включить путь для не найденных заголовков stdlibc++»!

Hordon 07.07.2019 21:12

У вас случайно не указана цель обратного развертывания старше macOS 10.15? Это будет отображаться в вашей командной строке как что-то вроде -mmacosx-version-min=<value>.

Louis Dionne 08.07.2019 16:43

@LouisDionne О да, это была проблема! Как только я установил цель развертывания на 10.15, код собрался отлично! Я никогда раньше не слышал о целях развертывания, большое спасибо!

Hordon 08.07.2019 20:10
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
11
8
3 645
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Продвижение моего комментария в ответ:

Do you happen to have a back-deployment target older than macOS 10.15 specified? This would appear on your command-line as something like -mmacosx-version-min=<value>.

@LouisDionne Oh yes, that was the problem! As soon as I set the deployment target to 10.15 the code build perfectly! I've never heard of deployment targets before, thank you very much!

Просто чтобы объяснить, что здесь происходит, проблема в том, что поддержка <filesystem> была введена только в Mac OS 10.15. Когда вы используете -mmacosx-version-min=XYZ, вы сообщаете компилятору, что ваша программа должна работать в версиях Mac OS вплоть до версии XYZ. Если вы используете версию старше 10.15, мы сообщаем вам во время компиляции, что вы не можете использовать <filesystem>, потому что это будет ошибкой времени выполнения (вероятно, символ отсутствует в libc++.dylib), если вы попытаетесь запустить программу на версии Mac. ОС старше 10.15.

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