例えば、C:\somewhere\your_appliフォルダがVisual Studio C++のソリューションフォルダだとする。この下に、some_projectプロジェクトとother_projectプロジェクトがあるとする。普通以下のような構成になる。
C:\somewhere\your_appli\ your_appli.sln Debug/ (Win32のDebug実行ファイル) Release/ (Win32のRelease実行ファイル) x64/ Debug/ (x64のDebug実行ファイル) Release/ (x64のRelease実行ファイル) some_project/ deletable.vcxproj *.cpp *.h Debug/ (Win32のDebug中間ファイル) Release/ (Win32のRelease中間ファイル) x64/ Debug/ (x64のDebug中間ファイル) Release/ (x64のRelease中間ファイル) other_project/ (some_projectと同様なので略)
Visual Studioでプロジェクトのプロパティを開き、構成プロパティの「全般」を見ると、マクロを用いてパスが記述されている。よく使うマクロは以下。
- $(SolutionDir):.slnフォルダが置いてあるフォルダのフルパス
- 例:C:\somewhere\your_appli\
- $(ProjectDir):プロジェクトのフォルダのフルパス
- 例:C:\somewhere\your_appli\some_project\
- $(TargetDir):ビルドにより生成される.exeファイルが置かれるフォルダのフルパス
- 例:C:\somewhere\your_appli\Debug\
- $(Configuration):プロジェクトのコンフィギュレーション
- 例:Debug か Releaseか
- $(Platform):プラットフォーム。
- $(ProjectName):プロジェクトの名前
- 例:some_project
このマクロを心得ると、プロパティに書かれたパスを読みこなすことができる。
例:出力ディレクトリ
出力ディレクトリのパスは、プラットフォームがx64の場合とWin32の場合とで異なる。 プラットフォームがx64の場合は
$(SolutionDir)$(Platform)\$(Configuration)\
である。これは、例えば
C:\somewhere\your_appli\Win32\Debug
に展開される。
プラットフォームがWin32の場合は
$(SolutionDir)$(Configuration)\
である。これは、例えば
C:\somewhere\your_appli\Debug
に展開される。
応用1:ライブラリパスを簡潔に書く
例えば、OpenCVのライブラリにパスを通すとき、Debugモードで
C:\somewhere\lib\Debug
Releaseモードで
C:\somewhere\lib\Release
などと、モードに応じてパスを二回も書くことがあるが、これは冗長。
C:\somewhere\lib\$(Configuration)
と書くのがよい。これなら、DebugモードでもReleaseモードでも同じ記述でOKとなる。
応用2:ビルドイベント
プロパティ→構成プロパティ→ビルドイベントにコマンドを設定すると、ビルド前やビルド後に所望の処理をさせることができる。
例えば、ビルド後イベントに、「プログラムの実行に必要なDLLを、実行ファイルが置かれたフォルダにコピーする」処理を加えることで、手動でDLLをコピーする必要がなくなる。
このイベントを記述するときに、上記マクロが活用できる。例えば、ビルド後イベントに
xcopy /y /r "..\3rdparty\opencv\bin\x86_vc12\*.dll" "$(TargetDir)"
と書くと、あるディレクトリに置かれたすべてのDLLを、ビルドにより生成された.exeと同じフォルダに自動コピーすることができる。
ここで、/yは「既存ファイルを黙って上書き」、/rは「read onlyのファイルを上書き」の意味。
参考
ビルドのコマンドとプロパティのマクロに、もういいよってくらいたくさんのマクロがある。