在 VS2010 中將 $(OutDir) 設置為相對路徑 output\$(Platform)\fxhelper\$(Configuration)\,並將 $(IntDir) 設為 $(OutDir),發現中間文件仍生成在專案目錄而非預期目錄。
打開專案文件 .vcxproj 發現:
<IntDir>$(OutDir)</IntDir> <!-- 先引用 OutDir --> <OutDir>output\$(Platform)\fxhelper\$(Configuration)\</OutDir> <-- 後定義 OutDir -->
MSBuild 按順序求值,$(OutDir) 在 $(IntDir) 使用時尚未定義,展開為空字符串,導致 $(IntDir) 為空,回退到默認值。
手動編輯 .vcxproj,將 OutDir 定義移到 IntDir 之前:
<OutDir>output\$(Platform)\fxhelper\$(Configuration)\</OutDir> <IntDir>$(OutDir)</IntDir>
保存重新載入專案,編譯即正常輸出到指定目錄。
$(SolutionDir) 或 $(ProjectDir) 等已定義宏作為基準,避免自定義宏互相引用。VS2010 專案屬性宏定義順序敏感,$(IntDir) 引用 $(OutDir) 時必須確保後者已在 .vcxproj 中先定義。圖形介面無法調整順序,需手動編輯專案文件。此問題在較新 VS 版本中可能已改善,但理解求值順序原理對調試構建腳本至關重要。