macOS Clang C++17 filesystem header not found

C++MacosGccClangC++17

C++ Problem Overview


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.

C++ Solutions


Solution 1 - C++

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 - C++

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 - C++

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 - C++

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 - C++

> 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

Solution 6 - C++

I installed XCode 9.4 - no <filesystem>

But Homebrew came to the rescue with LLVM 6

brew update
brew install llvm

And with a change in PATH, I was away.

Solution 7 - C++

If anyone still interested, Xcode 10 Beta ships with libc++ that has experimental/filesystem

UPDATE one of Xcode 10 betas used to ship with it, perhaps by accident, Xcode 10.1 unfortunately, doesn't have it :(

Solution 8 - C++

Recursive directory walk using ftw in c, more details here.

On, -std=c++17 for macOS version 10.xx, filesystem header is not available.

#include <ftw.h>
#include <stdio.h>
#include <sys/stat.h>
#include <string.h>

 
int list(const char *name, const struct stat *status, int type)
{
     if (type == FTW_NS)
     {
         return 0;
     }

     if (type == FTW_F)
     {
         printf("0%3o\t%s\n", status->st_mode&0777, name);
     }

     if (type == FTW_D && strcmp(".", name) != 0)
     {
         printf("0%3o\t%s/\n", status->st_mode&0777, name);
     }
     return 0;
}

int main(int argc, char *argv[])
{
     if(argc == 1)
     {
         ftw(".", list, 1);
     }
     else
     {
         ftw(argv[1], list, 1);
     }

     return 0;
}

output looks like following:

0755	./Shivaji/
0644	./Shivaji/20200516_204454.png
0644	./Shivaji/20200527_160408.png
0644	./Shivaji/20200527_160352.png
0644	./Shivaji/20200520_174754.png
0644	./Shivaji/20200520_180103.png
0755	./Saif/
0644	./Saif/Snapchat-1751229005.jpg
0644	./Saif/Snapchat-1356123194.jpg
0644	./Saif/Snapchat-613911286.jpg
0644	./Saif/Snapchat-107742096.jpg
0755	./Milind/
0644	./Milind/IMG_1828.JPG
0644	./Milind/IMG_1839.JPG
0644	./Milind/IMG_1825.JPG
0644	./Milind/IMG_1831.JPG
0644	./Milind/IMG_1840.JPG

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionsnoatoView Question on Stackoverflow
Solution 1 - C++EricWFView Answer on Stackoverflow
Solution 2 - C++Brad AllredView Answer on Stackoverflow
Solution 3 - C++JasonView Answer on Stackoverflow
Solution 4 - C++bfxView Answer on Stackoverflow
Solution 5 - C++jvillasanteView Answer on Stackoverflow
Solution 6 - C++DeeDeeCeeView Answer on Stackoverflow
Solution 7 - C++Max RaskinView Answer on Stackoverflow
Solution 8 - C++Milind DeoreView Answer on Stackoverflow