例えば、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のファイルを上書き」の意味。
参考
ビルドのコマンドとプロパティのマクロに、もういいよってくらいたくさんのマクロがある。