深夜2時のコンパイルの壁
MacでCまたはC++のプロジェクトに没頭し、順調に進んでいる最中、コンパイルを実行した瞬間にたった1行のエラーで作業が止まってしまうことがあります。
fatal error: 'stdio.h' file not found
#include <stdio.h>
^~~~~~~~~
1 error generated.
これは衝撃的なエラーです。stdio.hはC言語プログラミングの土台であり、コンパイラがこれを見つけられないということは、何も見つけられないことを意味します。安心してください。ファイルがハードドライブから消えたわけではありません。単に、コンパイラがAppleのシステムヘッダーの隠し場所を見失っただけです。これは通常、macOSのアップデート(SonomaやSequoiaへの移行など)やXcodeの更新後に発生します。
なぜヘッダーファイルが消えたのか?
歴史的に、macOSはヘッダーファイルを/usr/includeに保持していました。以前はls /usr/includeを実行すれば、おなじみの.hファイルの一覧を確認できました。しかし、macOS 10.14 Mojave以降、Appleはシステムの整合性を保護するためにこのディレクトリを削除しました。現在、ヘッダーはXcodeまたはCommand Line Tools (CLT) フォルダの奥深くにあるSDKバンドルの中にのみ存在します。
このエラーは通常、以下の4つの理由のいずれかで発生します。
- Command Line Toolsが欠落しているか、一部が削除された。
- アクティブな開発者パスが、存在しない、または古いXcodeバージョンを指している。
- 最近のmacOSアップデートにより、コンパイラが依存するシンボリックリンクが破損した。
- 複数のバージョンのXcodeをインストールしており、システムがどれを「アクティブ」にするか混乱している。
ステップ1:クイックフィックス(CLTの再インストール)
ほとんどの失敗は、スタンドアロンのCommand Line Toolsのインストールが破損していることに起因します。12GBのXcodeアプリをフルでインストールしていても、約1GBの小さなコマンドラインユーティリティは、システムに認識させるために個別の操作が必要になることがよくあります。
ターミナルを開き、以下を実行します:
xcode-select --install
ポップアップが表示されたら、インストールをクリックします。もしxcode-select: error: command line tools are already installedというメッセージが表示された場合は、ファイルは存在しますがパスが壊れている可能性があります。ステップ2に進んでください。
ステップ2:開発者パスのリセット
特に移行やOSアップデートの後、ツールへのシステムの「ポインタ」が破損することがあります。次のコマンドを実行することで、macOSにこのポインタをデフォルトの場所に強制的にリセットさせることができます。
sudo xcode-select --reset
プロンプトが表示されたらパスワードを入力してください。このコマンドは成功メッセージを表示しませんが、clangやgccを正しいSDKパスに再調整するのに非常に効果的です。
ステップ3:SDKパスを手動でマッピングする
独自のMakefileやCMakeのようなビルドシステムを使用している場合、自動ツールがヘッダーを見つけるのに苦労することがあります。最新のmacOSヘッダーがどこにあるかは、xcrun --show-sdk-pathを実行することで確認できます。
実際にヘッダーがどこにあるかを確認するために、以下を実行します:
xcrun --show-sdk-path
おそらく/Library/Developer/CommandLineTools/SDKs/MacOSX.sdkのようなパスが返されます。現在のターミナルセッションで失敗しているビルドを修正するには、SDKROOT環境変数をエクスポートします:
export SDKROOT=$(xcrun --show-sdk-path)
もう一度コンパイルを試してください。これで解決した場合は、この行を~/.zshrcファイルに追加して、今後のすべてのターミナルセッションで永続的に有効にします。
ステップ4:クリーンな状態に戻す(最終手段)
時折、アップデートによってツールが「ゾンビ」状態(ファイルは存在するが、新しいOSバージョンと互換性がない状態)になることがあります。この場合は、ディレクトリを削除して最初からやり直してください。
- 現在のパスを確認する:
xcode-select -p - ディレクトリを完全に削除する(慎重に):
sudo rm -rf /Library/Developer/CommandLineTools - 新規ダウンロードを開始する:
xcode-select --install
検証:修正のテスト
動作確認のために大規模なプロジェクトのビルドを走らせて時間を無駄にする必要はありません。test.cという名前で簡単なテストファイルを作成します:
#include <stdio.h>
int main() {
printf("成功: stdio.h が見つかりました!\n");
return 0;
}
このコマンドを実行してコンパイルと実行を行います:
cc test.c -o test_bin && ./test_bin
成功メッセージが表示されれば、環境は復旧しています。それでも失敗する場合は、CPATHやLIBRARY_PATH環境変数を確認してください。これらが古いパスでシステムのデフォルトを上書きしている可能性があります。
今後の再発を防ぐために
macOSのメジャーアップグレードを行うたびに、このエラーが再発することを覚悟しておいてください。アップデート直後にxcode-select --installを実行する習慣をつけましょう。Homebrewを使用している場合は、brew doctorを実行することも、ワークフローが台無しになる前にこれらのヘッダーの問題をキャッチする優れた方法です。

