我有一个 Visual Studio 2010 C++ 项目,其中包含需要使用生成 C++ 代码的内部自定义构建工具进行处理的文件。
我已经完成了为每个文件添加自定义构建工具的步骤。在自定义构建工具命令行中,使用“call”确保在编译 C++ 代码之前自定义构建工具针对所有这些文件运行。
唯一的问题是自定义构建工具需要从文件所在的目录运行,而不是从 Visual Studio 解决方案的位置运行。
我现在看到了一些可能的选择,但没有一个是理想的:
- 将第一个文件上的自定义构建工具命令行更改为:“cdworkingdir && call custom-tool ...”我不喜欢这个,因为它很脆弱 - 如果我在第一个文件之前添加一个按字母顺序排列的新文件,我必须记住,它需要自定义构建步骤中的这个特殊步骤。
- 创建一个批处理文件,用于更改工作目录、调用自定义构建工具,然后再更改回来。从 Visual Studio 调用此批处理文件。
- 使用“start”而不是“call”来调用自定义构建工具。这带来了为每个文件打开一个命令 shell 的缺点(看起来这些命令 shell 需要手动关闭)。
是否有更好的选择来对工作目录中的文件运行自定义构建工具?
谢谢。
最佳答案
Visual Studio 项目文件是 MSBuild 文件。因此,您可以在 VS 中构建项目时手动修改项目文件并执行其他操作。
要执行此操作:
- 创建一个简单的 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/