読者です 読者をやめる 読者になる 読者になる

Visual Studioのマクロ($(SolutionDir)とか$(Configuration)とか)に関するメモ

visual studio

このエントリーをはてなブックマークに追加

例えば、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と同様なので略)

Win32x86のことである。

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のファイルを上書き」の意味。

参考

ビルドのコマンドとプロパティのマクロに、もういいよってくらいたくさんのマクロがある。