プリコンパイル済みヘッダーを使用する

コミックマーケット76も終了しましたので、今日から通常営業再開です。


今回はプリコンパイル済みヘッダーに関してです。
今の今まですっかり忘れていましたが、ソースを整理していて思い出しました。

まずはプリコンパイルヘッダーを生成する為の.hと.cppをプロジェクトに追加します。
名前は何でも良いですが、とりあえずここではstdafxと言うことにしておきます。

stdafx.hの中身は

#ifndef __STDAFX_H__
#define __STDAFX_H__


//--------------------------------------------------------------
//  Windows関連
//--------------------------------------------------------------
#include <stdio.h>
#include <assert.h>
#include <tchar.h>
#include <windows.h>


//--------------------------------------------------------------
//  STD関連
//--------------------------------------------------------------
#include <string>
#include <vector>
#include <map>

using namespace std;


#endif//__STDAFX_H__

こんな感じで良く使う、且つあまり変更されないようなヘッダーや定義を入れておきます。
そして全ての.cppファイルの先頭でこのヘッダーファイルをインクルードします。

stdafx.cppの中身は

#include "stdafx.h"

これだけです。
他にはコメント以外書かない方が良いでしょう。

その次はプロジェクトの設定です。
まずはソリューションエクスプローラでプロジェクト名を右クリック→プロパティを選択します。
プロパティが開いたら、構成プロパティ → C/C++ → プリコンパイル済みヘッダーを選択します。
プリコンパイル済みヘッダーの作成/使用の項目を”プリコンパイル済みヘッダーを作成する (/Yc)”に設定します。
ファイルを使用して PCH を作成/使用の項目を前述のヘッダーファイル名に設定します。
プリコンパイル済みヘッダーファイルの項目はそのままで良いでしょう。
precompile01
こうすることでプリコンパイル済みヘッダーが生成され、使用されます。
ただ、この設定だけだと、.cppファイルが1つだけの時は良いのですが、複数の.cppをコンパイル、リンクするようなプロジェクトの場合、
以下のような警告とエラーが発生してしまいます。

1>warning C4727: 同じタイムスタンプを伴う、f:\project\gkn_viewer\release\gkn_viewer.pch と名前指定された PCH が f:\project\gkn_viewer\Release\camera.obj および f:\project\gkn_viewer\Release\app.obj で見つかりました。最初の PCH を使用します。
1>camera.obj : error LNK2005: ___@@_PchSym_@00@UkilqvxgUtpmPervdviUivovzhvUhgwzucOlyq@ は既に app.obj で定義されています。

これを回避するにはプロジェクトのプロパティで
プリコンパイル済みヘッダーの作成/使用の項目を”プリコンパイル済みヘッダー ファイルを使用する (/Yu)”に設定します。
precompile02

これだけだとプロジェクトをクリーンしたりしてプリコンパイルヘッダが削除された時にプリコンパイルヘッダが再生成されず、困るので、
プロジェクトに含まれるどれか1つの.cppファイルだけがプリコンパイルヘッダーを生成するようにします。
そこで使用するのが最初に追加したstdafx.cppファイルです。
ソリューションエクスプローラでstdafx.cppのファイル名を右クリック→プロパティを選択します。
プリコンパイル済みヘッダーの作成/使用の項目を”プリコンパイル済みヘッダーを作成する (/Yc)”に設定します。

これでプリコンパイル済みヘッダーを問題なく利用出来るはずです。
プロジェクトが大きくなるほどプリコンパイル済みヘッダーは威力を発揮するので、
使えるようにしておいて損は無いと思います。

では、今回はこの辺で。

コメントする

post date*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トラックバックする

トラックバック用URL:

アニメーションが親切に解説されております

レンダリング、ライティングの基本が分かります

図版が見やすい美術解剖書です