きっかけ
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 で正しい参照をするようにしておきます。
alias g++='g++ --sysroot=`xcrun --show-sdk-path`'
参考サイト
他の原因によるエラーの場合もあるので、その際は以下を参照してみてください。