9

我最近将一个中型 Visual Studio 2005 解决方案转换为 Visual Studio 2010。其中一个项目包含不是 C/C++ 文件的文件,而是使用运行自定义构建工具的批处理文件编译的。自定义构建步骤的输出是一些 C++ 文件,之后必须对其进行编译。

相关文件属性中自定义构建步骤的输出正确设置为生成的 C++ 文件。

问题是有时 VS2010 会尝试在使用自定义构建步骤的文件之前编译生成的 C++ 文件,这意味着在干净的构建中它无法找到 C++ 文件并失败。如果我尝试构建几次最终它会编译自定义文件然后构建会成功,但这显然不是自动构建的好解决方案。

在 VS2005 中构建这个项目没有问题,但是 VS2010 无法从自定义构建步骤的输出中确定正确的编译顺序。在VS2010中是否有另一种强制正确编译顺序的方法?

4

4 回答 4

3

Visual Studio 支持并行构建,它可以同时构建多个项目。如果无法正确查看项目之间的依赖关系,这将无法正常工作。自定义构建在这里肯定会成为麻烦制造者。并行构建的数量是可配置的,将其设置为 1 将是一种非常粗略但有效的解决方法。工具+选项,项目和解决方案,构建和运行,“并行项目构建的最大数量”设置。

但不要这样做,并行构建可以节省大量时间。您可以通过显式设置项目依赖项来解决此类问题。在解决方案资源管理器窗口中右键单击使用生成的 C++ 文件的项目,然后单击项目依赖项。勾选生成 C++ 文件的项目的复选框。如果它与其他读者相关,请检查此答案以创建仅执行自定义构建步骤而没有其他任何内容的项目。

于 2012-10-08T09:32:54.157 回答
1

默认情况下,Visual Studio 2008 首先执行自定义构建工具。可以使用命令“工具构建顺序”通过项目上的右键菜单更改顺序。此功能在 Visual Studio 2010 中不可用。我不知道解决方法。

于 2013-10-18T20:16:32.580 回答
1

考虑使用 Visual Studio 2010 的“属性 >> 配置属性 >> 构建事件 >> 预构建事件”作为您应该发出命令以构建必须首先编译的源文件的位置。在命令行字段中,调用 cl.exe 编译器或使用小型外部 makefile 来编译这些文件。然后,Visual Studio 将在此初始步骤之后编译项目的其余部分。

于 2015-08-21T21:45:55.723 回答
0

当我注意到我的自定义构建步骤一次只运行一个文件时,我解决了我的问题。它在下一次构建等时为下一个文件运行。原因显然是我的自定义构建步骤正在调用一个批处理文件,而 VS2010 创建一个临时批处理文件来执行所有自定义构建文件。该讨论中指出了解决方案: http: //social.msdn.microsoft.com/Forums/en-HK/msbuild/thread/ca392036-ebdb-4812-930e-f90aa445cca5 它只是在所有对批处理文件的调用前加上前缀“调用”语句,因此不会过早终止主批处理文件的执行。

于 2012-10-22T06:04:02.967 回答