c++ - Visual Studio 2010 : Specify working directory when running custom build tools on individual files

标签 c++ visual-studio-2010 visual-studio batch-file visual-studio-2012

我有一个 Visual Studio 2010 C++ 项目,其中包含需要使用生成 C++ 代码的内部自定义构建工具进行处理的文件。

我已经完成了为每个文件添加自定义构建工具的步骤。在自定义构建工具命令行中,使用“call”确保在编译 C++ 代码之前自定义构建工具针对所有这些文件运行。

唯一的问题是自定义构建工具需要从文件所在的目录运行,而不是从 Visual Studio 解决方案的位置运行。

我现在看到了一些可能的选择,但没有一个是理想的:

  1. 将第一个文件上的自定义构建工具命令行更改为:“cdworkingdir && call custom-tool ...”我不喜欢这个,因为它很脆弱 - 如果我在第一个文件之前添加一个按字母顺序排列的新文件,我必须记住,它需要自定义构建步骤中的这个特殊步骤。
  2. 创建一个批处理文件,用于更改工作目录、调用自定义构建工具,然后再更改回来。从 Visual Studio 调用此批处理文件。
  3. 使用“start”而不是“call”来调用自定义构建工具。这带来了为每个文件打开一个命令 shell 的缺点(看起来这些命令 shell 需要手动关闭)。

是否有更好的选择来对工作目录中的文件运行自定义构建工具?

谢谢。

最佳答案

Visual Studio 项目文件是 MSBuild 文件。因此,您可以在 VS 中构建项目时手动修改项目文件并执行其他操作。

要执行此操作:

  1. 创建一个简单的 MSbuild 文件,例如名为MyCustomtool.target 。此文件“覆盖”MSBuild 目标并调用您的自定义工具。

这是示例文件:

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="BeforeBuild">
    <Message Text="Calling custom tool for %(ClCompile.Identity)"/>
    <Exec Command="customtool.exe %(ClCompile.Identity)" WorkingDirectory="$(ProjectDir)" />
  </Target>
</Project>

这个文件: “覆盖”目标名称“BeforeBuild”,并且对于“ClCompile”组中定义的每个文件显示文本消息并执行 customtool.exe,并将名称编译的 .cpp 文件作为参数。

  • 您必须修改 .vcxproj 文件并在最后一行包含 </Project> 之前导入文件并添加一行:
  • <Import Project="MyCustomtool.target"/>

    此后,Visual Studio 将为项目中的每个文件执行您的自定义工具。

    一些评论:

    • 因为我没有安装 VS 2010,所以我不能 100% 确定您可以使用哪个目标名称。我认为“BeforeBuild”应该对 VS 2010 有效(在 VS 2017 中我使用“BeforeBuildGenerateSources”)。

    • 您可以将选项“工具/选项/项目和解决方案/生成和运行/MSBuild 项目生成输出详细程度”更改为“详细”,查看生成过程的详细输出并检查目标名称。

    • 文件组“ClCompile”包含所有 *.cpp 文件。您可以检查 .vcxproj 文件中的文件组名称。
    • 您可以为自定义工具设置工作目录(如上所述)。如果您需要在 MSBuild 文件中使用 VisualStudio 宏,例如 $(ProjectDir)、$(OutDir) 等。

    关于c++ - Visual Studio 2010 : Specify working directory when running custom build tools on individual files,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23554030/

    相关文章:

    c++ - 是否有一种数据结构不允许重复并且还保持输入顺序?

    c# - 使按钮单击的事件处理程序启动一个名为 MainPage_Loaded 的新事件

    c++ - 'ld : unknown option: -rpath=./libs' - 在 mac os 10.7.5 上构建 openframework 插件时出现链接错误

    c++ - 当我从 char[] 转到 string 时,为什么我的冒号字符消失了?

    c - 从 64 位整数类型加载 __m64?

    visual-studio-2010 - 在 VS 中保存设置而不退出

    asp.net - 报表查看器工具栏图标间距太大

    包含的 HTML 文档类型(Visual Studio 或 HTML 通用)

    windows - 代码签名证书的问题

    c++ - cppdepend。问题?发行说明?社区?支持?