Мне нужно использовать заголовок файловой системы С++ 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);
}
@Someprogrammerdude Я добавил простой пример кода. Я настроил этот проект как приложение командной строки и добавил к нему библиотеки GoogleTest и OpenCV с некоторыми специфическими флагами opencv.
@DonátHorváth «Фрагмент кода» — это большая разница из минимальный воспроизводимый пример, что и было запрошено.
Насколько мне известно, Apple больше не поставляет libstdc++ с Mac OS; так что это действительно не должно быть выбором в Xcode. Я дам знать людям в Apple. Но это не ответ на ваш вопрос.
@JesperJuhl Достаточно честно, обновил фрагмент!
@MarshallClow О, это ответ на часть «включить путь для не найденных заголовков stdlibc++»!
У вас случайно не указана цель обратного развертывания старше macOS 10.15? Это будет отображаться в вашей командной строке как что-то вроде -mmacosx-version-min=<value>.
@LouisDionne О да, это была проблема! Как только я установил цель развертывания на 10.15, код собрался отлично! Я никогда раньше не слышал о целях развертывания, большое спасибо!





Продвижение моего комментария в ответ:
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.
У вас есть минимальный воспроизводимый пример, который не работает, и вы можете нам его показать? Как вы создавали свой проект? Возможно, вам нужно добавить флаги (явно или через переключатель), чтобы включить C++17?