BigSur で "wchar.h: No such file or directory" コンパイルエラー


きっかけ

MacBook に BigSur をクリーンインストールして、Homebrew で gcc を入れてから、g++ で C++ をしてみると、以下のエラーが出てコンパイルできなかった。

$ g++ main.cpp
(・・・中略・・・)
/usr/local/Cellar/gcc/10.2.0/include/c++/10.2.0/cwchar:44:10: fatal error: wchar.h: No such file or directory
   44 | #include <wchar.h>
      |          ^~~~~~~~~
compilation terminated.

環境

  • MacOS BigSur
  • zsh 5.8
  • g++ 10.2.0

模索

https://qiita.com/yoya/items/c0b26cba3c040c581643
こちらの記事で知ったのですが、、Xcode10 からは、インクルードファイルは、/usr/include/ の中ではなく、SKD の中のものを使う仕様に変更されたようです。(以下、Xcode10 のリリースノート)

The command line tools will search the SDK for system headers by default.
However, some software may fail to build correctly against the SDK and
require macOS headers to be installed in the base system under /usr/include.
If you are the maintainer of such software, we encourage you to update
your project to work with the SDK or file a bug report for issues that are
preventing you from doing so.

そこで、SDK がどこにあるか探してみます。

$ xcrun --show-sdk-path
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk

つぎに、g++ がどこからインクルードを読み取ってるかを調べてみます。

$ /usr/local/bin/g++ -v
Using built-in specs.
COLLECT_GCC=/usr/local/bin/g++
(・・・中略・・・)
 --with-sysroot=/Library/Developer/CommandLineTools/SDKs/MacOSX11.0.sdk 
(・・・後略・・・)
$ ls /Library/Developer/CommandLineTools/SDKs
MacOSX.sdk     MacOSX11.1.sdk

原因と解決

どうやら、g++ 自体は Xcode の変わった規定に対応していたようですが、なにかしらの拍子で改変されたか、Mac のファイルが事故で消えたかで、参照がうまく行っていなかったようでした。alias で正しい参照をするようにしておきます。

.zshrc
alias g++='g++ --sysroot=`xcrun --show-sdk-path`'

参考サイト

他の原因によるエラーの場合もあるので、その際は以下を参照してみてください。
- macOS 'wchar.h' File Not Found (Stack Overflow)
- Can't compile C program on a Mac after upgrade to Mojave
(Stack Overflow)

- Build issues on macOS Catalina (fatal error: 'wchar.h' file not found) #1055 (GitHub)