ぷるぷるの雑記

低レイヤーがんばるぞいなブログ. 記事のご利用は自己責任で.

Visual Studioがフォルダを移動してもビルドできる仕組み

Visual Studioで作成したソリューションやプロジェクトはフォルダごと場所を移動してもIDE上で正しくビルドすることが出来ます.

ということはパスが自動的に解決されていることになりますが、その仕組みを簡単にまとめました.

プロジェクトのマクロが関わってくるので、必要であれば以下の記事も参考にしてください.

prupru-prune.hatenablog.com

検証バージョン

項目 バージョン
Visual Studio 2017

ソリューションフォルダを移動した場合

ソリューションやプロジェクトのディレクトリを表すマクロは以下になります.

マクロ 説明
$(ProjectDir) プロジェクトのディレクト
$(SolutionDir) ソリューションのディレクト


また、デフォルト時に上記のマクロを参照しているマクロには次のようなものがあります.

マクロ 説明 デフォルト値
$(OutDir) 生成物の出力先 $(SolutionDir)$(Configuration)\
$(IntDir) 中間ファイルの出力ディレクト $(Configuration)\ *1
$(TargetPath) プライマリ出力ファイルへの絶対パス. $(OutDir)$(TargetName)$(TargetExt)
$(TLogLocation) tlogファイルの出力先ディレクト $(IntDir)$(MSBuildProjectName).log


実は$(ProjectDir)と$(SolutionDir)は .slnファイルをIDEで開いた時に自動的に解決されます(.slnファイルへのパスを自動的に認識してマクロに反映してくれるっぽい). したがってその他のプロパティもデフォルトの時、 ソリューションフォルダを移動しようがビルドの生成物の出力先は相対的に不変です.

プロジェクトだけを移動した場合

Visual Studioで作成したプロジェクトは、そのプロジェクト単体でビルドすることが出来ます. つまり、ディレクトリに.slnファイルが存在する必要はありません. プロジェクト単体で立ち上げようと.vcxprojファイルをIDEで開いた時、 .vcxprojファイルと同じパスに仮想的な.slnファイルがあるような振る舞いをします. .vcxprojファイルをIDEで開いた時のソリューションエクスプローラーをみるとそんな感じの振る舞いをしていることが分かります.

言い換えると、 $(ProjectDir)と$(SolutionDir)が同じ値になります.

プロジェクト単体のソリューションエクスプローラー. 仮想的なソリューションが出来ている.

ただし、 .vcxprojファイルの直上ディレクトリにそのプロジェクトをインポートしている.slnファイルがある場合は、.slnファイルをIDEで開いた時と同じ振る舞いになります .

マクロ以外の部分

プロパティに設定する値はマクロと固定値を組み合わせることが出来ます. IDEからプロパティを変更すると.vcxprojファイルに対応するプロパティが追記されます. 例えばプロジェクトプロパティの出力ディレクトリを変更すると、.vcxprojファイル上にOutDirプロパティが追加されます.

デフォルト時の.vcxprojファイル

出力ディレクトリを指定した.vcxprojファイル

このような場合はマクロの部分は自動的に解決されつつ、ユーザーが定義した値も反映されます. ソリューションフォルダを移動してもビルドできるようにするために、相対パスで指定しておくのが無難です.

これだけまとめ

  • ビルドに関するパスを自動的に解決されるマクロ+相対パスで指定しているならフォルダを移動しても正しくビルドできる
  • .vcxprojファイルをIDEで開いた時、直上ディレクトリにそのプロジェクトをインポートしている.slnファイルがある場合は.slnファイルを開いた時と同じ振る舞いをする
  • .vcxprojファイルをIDEで開いた時、直上ディレクトリにそのプロジェクトをインポートしている.slnファイルがない場合は仮想的な.slnファイルが.vcxprojファイルと同じ場所に生成されると考える.

*1:暗に$(ProjectDir)を参照している