$(TargetPath)在加载宏时没有评估?

时间:2018-02-19 08:46:33

标签: visual-c++ msbuild visual-studio-2017 visual-studio-macros

我有一个文件custom.props,我在其中定义了一个在项目中使用的宏。在这个例子中,我是这样的:

<VST2_32_COMMAND_ARGS>$(TargetPath) /noload /nosave /noexc /noft</VST2_32_COMMAND_ARGS>

当我加载项目,并查看属性,调试,命令参数时,我可以访问该宏VST2_32_COMMAND_ARGS。但该字符串被评估为/noload /nosave /noexc /noft

基本上,$(TargetPath)未被评估。在我的情况下,该路径指向一个DLL,所以它应该是这样的事情:

"C:\Program Files (x86)\VstPlugins\Plug\vst2\Win32\bin\MyPlug.dll" /noload /nosave /noexc /noft

但它空洞。我该怎么办呢?还试过这个:

<VST2_32_COMMAND_ARGS>"$(TargetPath)" /noload /nosave /noexc /noft</VST2_32_COMMAND_ARGS>

但结果是:

"" /noload /nosave /noexc /noft

1 个答案:

答案 0 :(得分:1)

  

$(TargetPath)在加载宏时没有评估?

要解决此问题,您应该在导入文件custom.props之后导入Microsoft.Cpp.targets文件

   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <Import Project="Custom.props" />

这是因为文件Microsoft.Cpp.Current.targets设置的Macros for Build Commands and Properties的值:

  <Target Name="SetUserMacroEnvironmentVariables" 
          Condition="'@(BuildMacro)' != '' and '$(DesignTimeBuild)' != 'true'">

    <SetEnv Condition="'%(BuildMacro.EnvironmentVariable)' == 'true'"
        Name   ="@(BuildMacro)"
        Value  ="%(BuildMacro.Value)"
        Prefix ="false">
      <Output TaskParameter="OutputEnvironmentVariable" PropertyName="%(BuildMacro.Identity)"/>
    </SetEnv>

  </Target>

文件Microsoft.Cpp.Current.targets由文件Microsoft.Cpp.targets导入:

 <Import Condition="'$(_Redirect)' != 'true'" Project="$(VCTargetsPath)\Microsoft.Cpp.Current.targets" />

所以如果您在导入文件Microsoft.Cpp.targets之前调用自定义文件中的某个宏,则MSBuild无法获取宏的值。

您可以按以下路径获取这些.targets个文件:

C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\VC\VCTargets

要验证VST2_32_COMMAND_ARGS的自定义值,我添加了一个简单的目标来输出该值。所以你的项目文件应该是:

  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

  <ImportGroup Label="ExtensionTargets">
  </ImportGroup>

  <Import Project="Custom.props" />

  <Target Name="TestByCustom" AfterTargets="Build">
    <Message Text="$(VST2_32_COMMAND_ARGS)"></Message>
  </Target>

构建完成后,我们可以获得$(TargetPath)

的值

enter image description here

我的custom.props文件:

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
   <VST2_32_COMMAND_ARGS>"$(TargetPath)" /noload /nosave /noexc /noft</VST2_32_COMMAND_ARGS>
  </PropertyGroup>

</Project>

希望这有帮助。