macOS Clang C++17 filesystem header not found

45,616

Solution 1

Libc++, which is the C++ standard library on OS X, has not moved <experimental/filesystem> to <filesystem> yet because the specification is not stable.

Hopefully <filesystem> will be a part of the Clang 6.0 release. (We missed 5.0)

Solution 2

Xcode 11 Beta now includes <filesystem>. Unlike the other answers indicating beta support in Xcode 10, Apple has mentioned this in the release notes.

Also mentioned in the release notes, is this is only supported by iOS 13, macOS 10.15, watchOS 6, and tvOS 13. You will only be able to use std::filesystem for projects targeting these versions or later.

Solution 3

In reply to Max Raskin: I've installed Xcode 10 Beta 4, from July 17, 2018, and this version does not have "#include <experimental/filesystem>" or "#include <filesystem>".

The release notes also do not mention libc++17 <filesystem>. The release notes do mention that the following are in Xcode 10: <any>, <optional>, and <variant>.

Example include file location:

/Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/experimental

Solution 4

EDIT

As mentioned in another answer <filesystem> is available in Xcode 11 Beta according to the release notes:

Clang now supports the C++17 <filesystem> library for iOS 13, macOS 10.15, watchOS 6, and tvOS 13. (50988273)

Here's hoping it's meant to stay this time!

OLD ANSWER

Just checked Xcode 10.2 Beta 4 and it has regular <filesystem>! For the curious, it's in /Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/.

EDIT:

Downloaded Xcode 10.2 (10E125) aaaaand ... <filesystem> is gone again. No mention whatsoever in the release notes. If you happen to have an Xcode version that contains <filesystem> lying around (like the Beta 4 I mentioned earlier) copying the file over seems to work okay:

$ sudo cp /Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/filesystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/

Mind you, of course, every Xcode update will very likely break this workaround and make another copy necessary. Also, there is probably a good reason why the beta implementation didn't make it into the release. Proceed with caution...

Solution 5

Including gets you the declarations, but to get the definitions you also have to link with -lstdc++fs (for libstdc++) or I don't know (for libc++). If someone knows, maybe they could update this answer?

For libc++ you need to link with -lc++experimental

Share:
45,616
snoato
Author by

snoato

Computer science graduate student at RWTH Aachen University; student assistant at RWTH's Knowledge-Based Systems Group.

Updated on July 21, 2020

Comments

  • snoato
    snoato almost 4 years

    I need to write a program using the (experimental) C++17 filesystem library but clang on my Mac (macOS 10.12.03) doesn't seem to have the filesystem header included.

    Since I'm required to use the C++17, I cannot use alternatives like the Boost library.

    When I try to compile a sample program that just includes filesystem and iostream (and writes to cout)

    #include <filesystem>
    #include <iostream>
    using namespace std;
    
    int main(){
        cout << "test" << endl;
    }
    

    I get the following error message:

    >clang test.cpp -std=c++1z
    
    test.cpp:2:10: fatal error: 'filesystem' file not found
    #include <filesystem>
             ^
    1 error generated.
    

    When I try the same using GCC 6.3 (installed via homebrew) I get:

    >gcc-6 test.cpp  -std=c++17 
    test.cpp:2:22: fatal error: filesystem: No such file or directory
     #include <filesystem>
                          ^
    compilation terminated.
    

    I also tried using experimental/filesystem instead which compiles using gcc but seems to try to compile for iOS leading to another error which seems to be related to iostream

    Undefined symbols for architecture x86_64:
      "std::ios_base::Init::Init()", referenced from:
          __static_initialization_and_destruction_0(int, int) in ccd5QiVt.o
      "std::ios_base::Init::~Init()", referenced from:
          __static_initialization_and_destruction_0(int, int) in ccd5QiVt.o
    ld: symbol(s) not found for architecture x86_64
    collect2: error: ld returned 1 exit status
    

    The version of my clang is:

    >clang --version
    Apple LLVM version 8.0.0 (clang-800.0.42.1)
    Target: x86_64-apple-darwin16.4.0
    Thread model: posix
    InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
    

    I'm grateful for any helpful input since I couldn't find anything that solved my problem so far (although I might have been searching for the wrong terms).

    If you need more information I'll gladly provide it but I hope to have included everything.

  • snoato
    snoato about 7 years
    I see, thank you :) But shouldn't it be able to include <experimental/filesystem>?
  • EricWF
    EricWF about 7 years
    The rate at which Apple ships upstream libc++ changes is not up to me. Libc++ first shipped <experimental/filesystem> in 3.9 but Apple has yet to release it as a part of XCode. If you want to build your own version of libc++ from trunk it will have <experimental/filesystem>.
  • Quuxplusone
    Quuxplusone over 6 years
    Including <experimental/filesystem> gets you the declarations, but to get the definitions you also have to link with -lstdc++fs (for libstdc++) or I don't know (for libc++). If someone knows, maybe they could update this answer?
  • Lothar
    Lothar over 6 years
    Its a shame that filesystem is still not useable because Xcode is missing it and boost also misses some features from the specification (the charset u8string conversions for example). All we can do is wait for xcode 9.1 or later
  • Rudolfs Bundulis
    Rudolfs Bundulis over 6 years
    Just installed Xcode 9.2 and still no <experimental/filesystem> :(
  • Steve Wagner
    Steve Wagner over 5 years
    just installed Beta 6 and no joy
  • t0rakka
    t0rakka over 5 years
    10.1 and still no action.
  • leecbaker
    leecbaker about 5 years
    10.2b3 has <filesystem>, but requires a library to be linked. I'm not sure it includes the required library.
  • SMGreenfield
    SMGreenfield almost 5 years
    @Max Raskin -- No love in 10.2.1 either? I wonder if we might get a viable beta with std::filesystem by WWDC?
  • SMGreenfield
    SMGreenfield almost 5 years
    Is it possible <filesystem> being supported ONLY on the latest OS versions is related to Xcode 11 being in Beta? That would seem unworkable if you intended to support MacOS 10.12 through 10.14. Isn't there also Boost support built into earlier versions of MacOS? Perhaps the thinking is that we call all just use Boost.Filesystem before 10.15?
  • Brad Allred
    Brad Allred almost 5 years
    @SMGreenfield my suspicion is that libc++ on versions of macOS prior to 10.15 are lacking the filesystem implementation altogether. If you were to statically link libc++ its possible you could run your application on older systems (but there might be other issues with doing that depending on implementation). AFIK boost does not ship with macOS, but there is nothing stopping you from building/shipping with it.
  • I. Antonov
    I. Antonov over 4 years
    I am on Xcode Version 11.2.1 (11B500) and there's no filesystem.
  • Brad Allred
    Brad Allred over 4 years
    @I.Antonov I assure you it exists; I've been using it. Be sure to enable c++17 mode in your project. You may also need to change your SDK to one of the versions listed in my answer.
  • I. Antonov
    I. Antonov over 4 years
    @BradAllred Hi, I went to Build Settings and then selected C++17[-std=c++17] from the C++ Language Dialect and still same.
  • I. Antonov
    I. Antonov over 4 years
    @BradAllred if possible could you please check this thread and let me know where and what i'm doing wrong? I'd appreciate the help. stackoverflow.com/questions/58943032/…
  • Brad Allred
    Brad Allred over 4 years
    @I.Antonov I also said you need to use one of the supported SDKs.
  • Michael B
    Michael B over 2 years
    What was that change in PATH?