プリコンパイル済みヘッダーに関するエラーを解決する方法

プリコンパイル済みヘッダーとは、MicrosoftのVisual Studioにおいてプログラムのビルドを高速化するための仕組みです。複数の場所で共通に使うプログラムのうち、普段は変更しない部分をあらかじめコンパイルしておいて再利用しようという考え方です。ある程度以上の規模のプログラムを作るときには、ビルド時間を大幅に節約することが出来る便利な機能です。

ただ一方で、よくトラブルの原因にもなります。

  • プリコンパイル ヘッダーを検索中に不明な EOF が見つかりました。’#include “stdafx.h”‘ をソースに追加しましたか?
  • プリコンパイル済みオブジェクトはリンクされていません。イメージは動作しない可能性があります。
  • オブジェクト ファイルでプリコンパイル済みヘッダー の作成中は、情報を上書きできません

などとVSに言われた人も多いと思います。私もよく言われました。こんなことを言われる原因は色々なのですが、結局のところプリコンパイル済みヘッダーの仕組みをよく理解しないまま適当にやっていることに原因があると思います。ということで、プリコンパイル済みヘッダーの使い方をまとめてみました。

プリコンパイル済みヘッダーを使う典型的な例を図で示します。

プリコンパイル済みヘッダーの使用例

ポイントは”stdafx.h”、このファイルの中に共通で使用するヘッダファイルを全部書きます。stdio.hとかstdlib.hとかafxwin.hとかvectorとかそういうものです。基本的に自分で書いているものは入れない方がいいでしょう。年単位で変更しない自信があれば別ですが、そうでなければかえってビルドが遅くなる原因になってしまいます。

次に、”stdafx.h”をすべてのcppファイルでインクルードします。このとき注意が必要なのは、”stdafx.h”は必ずファイルの一番上でインクルードする、ということです。「#include “stdafx.h”」の前にはコメント以外書いてはいけません。

次のポイントは「stdafx.cpp」です。このファイルでは、”stdafx.h”のインクルードのみを行います。そして、ファイルのプロパティの「C/C++」にある「プリコンパイル済みヘッダー」のところで、「プリコンパイル済みヘッダー」のオプションを「作成(/Yc)」にします。これによりプリコンパイル済みヘッダーファイルが作成されるようになります。他のcppファイルについては、このオプションを「使用(/Yu)」にしておきます。そうしておかないと上にあるようなエラーとなってしまいます。何かの拍子にこの設定が変わっていることがありますので、はまったときはチェックしてみて下さい。

ということで、プリコンパイル済みヘッダーについて簡単にまとめました。理解していれば簡単なことなのですが、visual studioに慣れていない人は結構な確率で悩まされることでしょう。無駄な時間を使わないためにもぜひ覚えておきましょう。

StdAfx.h に関する考察