Properties MSBuild在生成VC++;项目

Properties MSBuild在生成VC++;项目,properties,msbuild,Properties,Msbuild,我正试图通过基于MSBuild的命令行构建具有不同属性的vcxproj。我测试了WarningLevel属性,因为它位于MSDN MSBuild简介页上 我的项目最初将WarningLevel设置为3。我开始说: msbuild myproj.vcxproj /p:Configuration=Debug /p:Platform=Win32 /p:WarningLevel=4;OutDir=test\Debug 我查看了tracker日志以查看执行的命令是什么,结果发现“/W3”仍然存在,而不是

我正试图通过基于MSBuild的命令行构建具有不同属性的vcxproj。我测试了WarningLevel属性,因为它位于MSDN MSBuild简介页上

我的项目最初将WarningLevel设置为3。我开始说:

msbuild myproj.vcxproj /p:Configuration=Debug /p:Platform=Win32 /p:WarningLevel=4;OutDir=test\Debug
我查看了tracker日志以查看执行的命令是什么,结果发现“/W3”仍然存在,而不是预期的“/W4”。但是,“OutDir”设置正确,我可以在bin\Debug目录中找到目标文件

我对WarningLevel做了什么不正确的事情吗?如何正确覆盖属性?请教我正确的方法,我将不胜感激

问候,


SL

这本质上是的一个副本,但该副本用于将项目添加到预处理定义列表中,这与覆盖警告级别(只能有一个值)不完全相同。这里是这样的:WarningLevel不像OutDir那样是一个全局属性,但它是ClCompile ItemDefinitionGroup的一部分,因此不能直接设置它。在项目文件中看起来有点像这样:

<PropertyGroup>
  <!-- global property, can be overridden on commandline -->
  <OutDir>$(ProjectDir)$(Configuration)$(Platform)</OutDir>
</PropertyGroup>

<ItemDefinitionGroup>
  <ClCompile>
    <!-- not a global property -->
    <WarningLevel>Level4</WarningLevel>
  </ClCompile>
<ItemDefinitionGroup>

并让msbuild使用
msbuild myproj.vcxproj/p:ForceImportBeforeCppTargets=/path/to/override.props拾取它。谢谢,第二个是我要找的。我正在尝试使用MSBuild自动化构建过程。根据你的第二个建议,我可以为大型项目创建一个模板。等我到家的时候,我会给它一个机会。它工作得很好,我会在我所有的项目中使用这个模板属性表。为了防止其他人稍后访问此线程并希望尝试属性表方式,有一件事需要注意。我认为您必须将您的配置作为ItemDefinitionGroup之后的in-liner as条件。例如,如果要将这些设置应用于调试Win32配置,则必须将该行编辑为
<ItemDefinitionGroup>
  <ClCompile>
    <!-- gets it's value from a global property now -->
    <WarningLevel>$(MyWarningLevel)</WarningLevel>
  </ClCompile>
<ItemDefinitionGroup>
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemDefinitionGroup $(PUT_IN_YOUR_CONDITION)>
    <ClCompile>
      <WarningLevel>Level4</WarningLevel>
    </ClCompile>
  </ItemDefinitionGroup>
</Project>