VS2019下VS2003风格项目向导VCCLCompilerTool无MultiProcessorCompilation属性问题
我在VS2019中使用VS2003风格的.NET项目向导,在default.js的AddConfig函数里写了以下代码:
var CLTool = config.Tools('VCCLCompilerTool'); // TODO: Add compiler settings var bMPFlag = wizard.FindSymbol('MP_FLAG'); var bPCHFlag = wizard.FindSymbol('PRE_COMPILED_HEADER_FLAG'); if (bMPFlag) { //CLTool.AdditionalOptions.concat(' /MP'); // 期望生效但没效果 //CLTool.AdditionalOptions='/MP8'; // 这条生效 //CLTool.MultiProcessorCompilation=true; // 属性不存在 } else { //CLTool.AdditionalOptions.replace('/MP',''); // 期望生效但没效果 //CLTool.AdditionalOptions='/MP1'; // 这条生效 //CLTool.MultiProcessorCompilation=false; // 属性不存在 }
目前我可以通过设置AdditionalOptions来添加/MP、/MP1或/MP8参数,但默认项目里自带MultiprocessorCompilation属性,默认会启用/MP。我希望根据用户输入来选择禁用/MP标志,但现在做不到。
VCCLCompilerTool接口里没有MultiProcessorCompilation属性。现在只能先修改默认项目文件移除/MP,再通过附加选项添加或不添加,但我想直接在default.js的AddConfig函数里解决,想知道有没有遗漏的方法。
我可以通过.UsePrecompiledHeader属性正常启用/禁用预编译头,但找不到对应的MultiProcessorCompilation属性来覆盖默认项目的设置。项目文件相关配置如下:
<ClCompile> <PrecompiledHeader>Use</PrecompiledHeader> <PreCompiledHeaderFile>tester.h</PreCompiledHeaderFile> <!--<MultiProcessorCompilation>true</MultiProcessorCompilation>--> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> </ClCompile>
我的理想方案是在项目文件(default-x64.vcxproj)里把<MultiProcessorCompilation>设为true,然后通过HTML界面的用户输入来禁用这个属性。用AdditionalOptions设置时,MSBuild/VS的属性不会同步更新,导致显示和实际不符,所以希望能通过JavaScript直接设置MSBuild属性。
要直接在default.js中控制MSBuild的MultiProcessorCompilation属性,你可以绕过VCCLCompilerTool接口,直接操作项目的MSBuild属性节点:
直接操作项目XML节点
在AddConfig函数中,通过config对象获取对应的MSBuild配置节点,直接添加或修改MultiProcessorCompilation属性:var bMPFlag = wizard.FindSymbol('MP_FLAG'); // 获取当前配置的ClCompile节点 var clCompileNode = config.XmlNode.SelectSingleNode('./ClCompile'); if (clCompileNode) { var mpNode = clCompileNode.SelectSingleNode('./MultiProcessorCompilation'); if (bMPFlag) { // 启用多核编译 if (mpNode) { mpNode.Text = 'true'; } else { var newNode = config.XmlNode.OwnerDocument.createElement('MultiProcessorCompilation'); newNode.Text = 'true'; clCompileNode.appendChild(newNode); } } else { // 禁用多核编译 if (mpNode) { mpNode.Text = 'false'; // 也可以直接移除节点:clCompileNode.removeChild(mpNode); } else { var newNode = config.XmlNode.OwnerDocument.createElement('MultiProcessorCompilation'); newNode.Text = 'false'; clCompileNode.appendChild(newNode); } } }这种方式直接修改项目XML结构,能确保VS/MSBuild的属性面板和实际编译参数同步,不会出现显示与实际不符的问题。
尝试使用AddToolProperty方法(环境兼容时)
如果向导环境支持,也可以用config.AddToolProperty直接映射属性:var bMPFlag = wizard.FindSymbol('MP_FLAG'); config.AddToolProperty('VCCLCompilerTool', 'MultiProcessorCompilation', bMPFlag ? 'true' : 'false');注意:该方法的可用性取决于向导版本,若
VCCLCompilerTool接口未暴露该属性,可能需要先确认环境支持情况。
内容的提问来源于stack exchange,提问作者Ross Youngblood

