以前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を使いたい場合は次のセクションのいずれかの方法をとる必要がありそうです。
参考:
対策
その1:Xcode付属のclang以外のコンパイラを導入する
Xcode付属のclangを使うのを諦めて、別途clangとかgccとかのコンパイラを用意する方法です。
homebrewでインストールできるgccの方が導入が簡単なので、こだわりのない人にはgccをおすすめします。gccのインストール方法は以下の記事で解説しています。
その2:boostを使用する
boostライブラリの中にstd::filesystem
と同等の機能のboost::filesystem
があるので、これを使えば解決できるはずです。
(自分は試したことないです。)
コメント