web-dev-qa-db-fra.com

Pourquoi Xcode 11 beta ne peut pas utiliser l'en-tête <filesystem> de C ++ 17?

J'ai besoin d'utiliser l'en-tête du système de fichiers de C++ 17 pour mon projet. Pour autant que je sache, Apple l'a finalement rendu disponible avec Xcode 11 et avec macOS Catalina. Je suis sur la dernière (beta 3) Xcode 11 et j'utilise macOS Catalina public beta 2, donc en théorie, cela devrait fonctionner. Mais pour une raison quelconque, ce n'est pas le cas, et Xcode donne des erreurs comme:

'~path' is unavailable: introduced in macOS 10.15

Si j'ai défini la bibliothèque standard C++ dans Build Setting sur libstdc ++ à partir de libc ++, ces erreurs ont disparu et j'ai reçu un avertissement:

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

et une tonne d'erreurs avec iostream et cstddef manquants dans divers fichiers. Que puis-je faire pour faire fonctionner le système de fichiers?

Edit: un exemple de code minimal

#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);
}
10
Hordon

Promouvoir mon commentaire en réponse:

Avez-vous une cible de redéploiement antérieure à macOS 10.15 spécifiée? Cela apparaîtra sur votre ligne de commande comme quelque chose comme -mmacosx-version-min=<value>.

@LouisDionne Oh oui, c'était le problème! Dès que j'ai défini la cible de déploiement à 10h15, le code est parfaitement construit! Je n'ai jamais entendu parler de cibles de déploiement auparavant, merci beaucoup!

Juste pour expliquer ce qui se passe ici, le problème est que le support de <filesystem> n'a été introduit que dans Mac OS 10.15. Lorsque vous utilisez -mmacosx-version-min=XYZ, vous indiquez au compilateur que votre programme devrait pouvoir fonctionner sur les versions de Mac OS jusqu'à la version XYZ. Si vous utilisez une version antérieure à 10.15, nous vous indiquons gentiment au moment de la compilation que vous ne pouvez pas utiliser <filesystem>, car il s'agirait d'une erreur d'exécution (symbole probable manquant dans libc++.dylib) si vous avez essayé d'exécuter le programme sur une version de Mac OS antérieure à 10.15.

7
Louis Dionne