ぷよぐらみんぐ勉強

勉強したやつとか疑問などを載せていきます。割りと雑に。

C++のプロジェクトテンプレートを作った

外部ライブラリとかいちいち設定するのだるいし、gitignoreとかの設定で毎度バラバラになるの非常にイライラするから統一したプロジェクトテンプレート作りました。

フォルダ構造

まずソリューション含めの構造を作る。

・SolutionFolder/
|- Project/
|  |-Middle/
|- Project2/
|  |-Middle/
|
|- Library/
|  |- Include/
|  |   |- 各種インクルード
|  |
|  |- StaticLib/
|  |   |-v140/   //vsのバージョン
|  |      |-Win32/
|  |      |  |-Debug/
|  |      |  |-Release/
|  |      |-x64/
|  |      |  |-Debug/
|  |      |  |-Release/
|  |   |-v141/
|  |       〃
|  |
|  |- Licenses/
|-Build/ 
|  |-Win32/
|     |-Debug/
|     |-Develop/
|     |-Relase/
|  |-x64/
|     |-Debug/
|     |-Develop/
|     |-Relase/

こんな感じ
いろいろと対応させるためにめっちゃフォルダを置きました。

例えばライブラリのフォルダ

  • ソリューションの直下にライブラリの参照を設定
  • ビルドの構成にDevelopを追加

デバッグ、開発版、出荷用の3種に増えました。

  • vsバージョンフォルダ

あとからvsバージョンを変えるとき面倒なのでvsバージョンフォルダ追加

次は出力設定

  • ソリューションの直下にBuildフォルダを挟む

標準設定だとDebugやらなんやらが乱立してますが、gitignoreの設定時
デバッグをするためのクラスとかをまとめるのにDebugフォルダとか使うので
ビルドするものはBuildフォルダにまとめる。というか複数のフォルダから1つのフォルダにまとめれば楽だし

次は中間ファイル

  • Middleフォルダにまとめとく

これもビルド同様複数から1つにまとめれば楽だから。

フォルダ構造は以上


次はプロジェクト設定

ライブラリ、インクルードは先程のパスにしておいて

Develop時
Releaseをベースにちょっと変えた

  • _DEVELOPマクロ追加

NDEBUGとdevelop判定用の_DEVELOPを追加しておいてコードで分岐できるように

というかDevelopの変更はこれくらいしかまだやってない。


他、ビルドイベント

  • ビルド前イベントにはstaticlibの参照を書いたヘッダーを生成するようにする

pythonで実装したので依存が増えるけどしゃーなし

コマンドライン引数にライブラリパスを追加するために自作マクロを作る。
ライブラリのファイル一覧が欲しかったけどライブラリパスマクロはリンカー設定時にしかなかったので自作する。
自作するにはカスタムプロパティを作成しビルド構成別にフォルダを指定する。

今回使った引数は 
・ライブラリパス
・構成の種類(DebugかReleaseかの判定。DevelopはRelease扱い) 
・構成の種類を示すマクロ _DEBUGか_DEVELOPかNDEBUGのどれかになる
・プラットフォームの種類 Win32かx64

これら4つはカスタムプロパティで自作しておく

そしたら上記の引数を判定してヘッダーファイルを作成。
これでライブラリを追加しても自動で取ってくるので便利。
ただ、ビルドイベントにこれを作ると毎度変更の確認がくるので注意
他にはプロパティはプロジェクトごとに作っておく

これでとりあえず統一した環境をプロジェクトテンプレートとして作成。

ライブラリテンプレートも上記のように設定しておき、
出力には上記で設定したライブラリフォルダパスを持ってくればそのまま使用できる。
さらにビルドイベントにてヘッダーのコピー処理をbatファイルで作っておけば自動更新が可能。

自動更新のbatファイル
プロジェクトフォルダ直下に置いてる

rd /s /q ..\Library\Include\%1
xcopy .\*.h ..\Library\Include\%1 /S /D /Y /I
xcopy .\*.hpp ..\Library\Include\%1 /S /D /Y /I

hppとh ファイルをコピーしておく