【问题标题】:How can I print full cl.exe path in my vcxproj file?如何在我的 vcxproj 文件中打印完整的 cl.exe 路径?
【发布时间】:2021-02-12 02:43:52
【问题描述】:

对于自定义构建目标,我希望获得在 ClCompile 目标中调用的正确版本 cl.exe 的完整路径。

来自retrieve path to cl.exe,我知道是%VCINSTALLDIR%\bin\x86\Hostx86\cl.exe%VCINSTALLDIR%\bin\x64\Hostx64\cl.exe,但我不想为x84 与x64 逻辑编写程序。

在 VCTargets\Microsoft.CppCommon.Targets 中,我发现有属性 ToolExe 和 ToolPath 被设置为 $(CLToolExe) 和 $(CLToolPath)。

覆盖这些属性也为我成功更改了编译器的路径,因此这些是属性名称是正确的。 Override Compiler in MSBuild

但是当我尝试在我的自定义目标 exec 类中打印 %(CL.ToolPath) 或 $(CLToolPath) 时,它什么也没打印。我还查看了 Visual Studio,但找不到它的设置位置。

是否有可以提供 cl.exe 完整路径的变量,或者有什么方法可以在我的自定义目标中打印 CL 任务的属性 ToolPath?

【问题讨论】:

  • 嗨,关于这个问题的任何更新?

标签: c++ visual-studio msbuild msbuild-task


【解决方案1】:

1) 如果您已经使用$(CLToolExe)$(CLToolPath) 设置了新的cl.exe,然后想要获取它的完整路径,您应该使用这个$(CLToolPath)$(CLToolExe) 来获取新值而不是%(CL.ToolPath)(没有这样的方法)。

这是我的测试结果:

其实,您可以直接在xxx.csporj 文件下覆盖这些属性,而不是在Microsoft.CppCommon.Targets 文件中,当您构建项目时,它将使用新的cl.exe

那么,我使用自定义目标来获取值:

<Target Name="test123" AfterTargets="ClCompile">
        <Exec Command="$(CLToolPath)$(CLToolExe)" />
        <Message Importance="high" Text="$(CLToolPath)$(CLToolExe)"></Message>
</Target>

2)如果您没有更改为新值并使用默认的cl.exe而不进行任何更改,则应使用$(ClCompilerPath)获取默认值。

 <Target Name="test123" AfterTargets="ClCompile">       
       <Message Importance="high" Text="$(ClCompilerPath)"></Message>
 </Target>

注意$(ClCompilerPath)无法获取$(CLToolPath)$(CLToolExe)的新值,因为它们不相关,只能获取默认值。

【讨论】:

  • $(ClCompilerPath) 没有为我打印任何内容。我完全尝试了这个目标 123。
  • 您的项目类型是什么?您是否错过了xxx.vcxproj 文件中的某些系统targetsprops 文件?您能否与我们分享您的xxx.vcxproj 文件?普通的c++工程是通过cl.exe编译的,属性ClCompilerPath是系统属性,定义了cl.exe的完整路径。它不应该是空的。此外,如果您创建一个新的默认 c++ 项目,它是否会打印属性ClCompilerPath
猜你喜欢
  • 2020-08-30
  • 2020-12-19
  • 1970-01-01
  • 2020-05-20
  • 1970-01-01
  • 1970-01-01
  • 2021-06-11
  • 2011-07-04
  • 1970-01-01
相关资源
最近更新 更多