Visual Studioで作成したソリューションやプロジェクトはフォルダごと場所を移動してもIDE上で正しくビルドすることが出来ます.
ということはパスが自動的に解決されていることになりますが、その仕組みを簡単にまとめました.
プロジェクトのマクロが関わってくるので、必要であれば以下の記事も参考にしてください.
検証バージョン
項目 | バージョン |
---|---|
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ファイルをIDEで開いた時、直上ディレクトリにそのプロジェクトをインポートしている.slnファイルがある場合は.slnファイルを開いた時と同じ振る舞いをする
- .vcxprojファイルをIDEで開いた時、直上ディレクトリにそのプロジェクトをインポートしている.slnファイルがない場合は仮想的な.slnファイルが.vcxprojファイルと同じ場所に生成されると考える.
*1:暗に$(ProjectDir)を参照している