Xcode付属のclangだとC++のfilesystemは動かなかった話

以前Windowsで書いたC++のコードをMacで動かそうとしたら「filesystemなんてないよ!!」ってclangコンパイラに怒られてちょっと調査したので、その調査メモです。

先に結論を書いておくと、Xcode付属のclangだとどうやってもfilesystemは使えそうにありませんでした。

環境

OSはmacOS Mojaveを使用しています。

clangのバージョンは以下の通りです。Xcode付属のデフォルトのものを使用しています。

$ clang++ -v
Apple LLVM version 10.0.1 (clang-1001.0.46.4)
Target: x86_64-apple-darwin18.7.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

余談ですが、Appleはclangのバージョンを独自に振るの、ややこしいからやめてもらえませんかね。どのC++のバージョンに対応しているのかわからない・・・。

現象

このなんの変哲もない、filesystemをincludeしただけのコードをコンパイルしてみます。

#include <filesystem>

int main() {
  return 0;
}
$ clang++ main.cpp -std=c++17
main.cpp:1:10: fatal error: 'filesystem' file not found
#include <filesystem>
         ^~~~~~~~~~~~
1 error generated.

「filesystemなんかないよ!!」って怒られました。

原因

単純に、Xcode付属のclangではまだfilesystemが導入されていない模様です。

自分の使ってるclang 10.0.1ではC++17のコンパイルオプションは存在するものの、C++17のすべての機能に対応しているわけではないようです。

実際にinclude用のファイルがあるディレクトリを探してみましたが、filesystemはなさそうです。

$ ls /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/filesystem
ls: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/filesystem: No such file or directory

C++17で標準入りする前は、filesystemはstd::experimentalというnamespaceにいたためexperimentalディレクトリ以下にいないかなーと思いましたが、残念ながらいませんでした。

$ ls /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/experimental/filesystem
ls: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/experimental/filesystem: No such file or directory

というわけで、現状Xcode付属のclangを使っている限り、std::filesystemは使えません。
(もしどうにかして使えるようにする方法をご存知の方は教えてください)

どうしてもfilesystemを使いたい場合は次のセクションのいずれかの方法をとる必要がありそうです。

参考:

macOS Clang C++17 filesystem header not found
I need to write a program using the (experimental) C++17 filesystem library but clang on my Mac (macOS 10.12.03) doesn't...
`filesystem` with c++17 doesn't work on my mac os x high sierra
I'm following this tutorial: to checkout new c++ filesystem feature. However I'm unable to compile even minimal example ...

対策

その1:Xcode付属のclang以外のコンパイラを導入する

Xcode付属のclangを使うのを諦めて、別途clangとかgccとかのコンパイラを用意する方法です。

homebrewでインストールできるgccの方が導入が簡単なので、こだわりのない人にはgccをおすすめします。gccのインストール方法は以下の記事で解説しています。

その2:boostを使用する

boostライブラリの中にstd::filesystemと同等の機能のboost::filesystemがあるので、これを使えば解決できるはずです。
(自分は試したことないです。)

コメント