我最近将一个中型Visual Studio 2005解决方案转换为Visual Studio 2010。 其中一个项目包含不是C / C ++文件的文件,并使用运行自定义构建工具的批处理文件进行编译。自定义构建步骤的输出是一些C ++文件,必须在此之后进行编译。
相关文件属性中自定义构建步骤的输出正确设置为生成的C ++文件。
问题在于,有时VS2010会尝试在使用自定义构建步骤的文件之前编译生成的C ++文件,这意味着在干净的构建中它无法找到C ++文件并失败。如果我最终尝试构建几次,它将编译自定义文件,然后构建将成功,但这显然不是自动构建的好解决方案。
在VS2005中,构建此项目没有问题,但VS2010无法从自定义构建步骤的输出中确定正确的编译顺序。还有另一种方法可以在VS2010中强制执行正确的编译顺序吗?
答案 0 :(得分:3)
Visual Studio支持并行构建,它可以同时构建多个项目。如果无法正确查看项目之间的依赖关系,这将无法正常工作。自定义构建肯定会成为麻烦制造者。并行构建的数量是可配置的,将其设置为1将是一个非常粗略但有效的解决方法。工具+选项,项目和解决方案,构建和运行,“最大并行项目构建数”设置。
但是不要这样做,并行构建可以节省大量时间。您可以通过显式设置项目依赖项来解决此类问题。在“解决方案资源管理器”窗口中右键单击使用生成的C ++文件的项目,然后单击“项目依赖项”。勾选生成C ++文件的项目的复选框。如果它与其他读者相关,请检查this answer以获取创建仅执行自定义构建步骤的项目的方法。
答案 1 :(得分:1)
Visual Studio 2008默认首先执行自定义构建工具。可以通过项目上的右键菜单使用命令“工具构建顺序”更改订单。此工具在Visual Studio 2010中不可用。我不知道解决方法。
答案 2 :(得分:1)
考虑使用Visual Studio 2010"属性>>配置属性>>构建事件>>预建活动"作为您应该发出命令来构建必须首先编译的源文件的地方。在“命令行”字段中,调用cl.exe编译器或使用小型外部makefile编译这些文件。然后,Visual Studio将在此初始步骤之后编译项目的其余部分。
答案 3 :(得分:0)
当我发现我的自定义构建步骤一次只运行一个文件时,我解决了我的问题。它运行下一个构建的下一个文件等。 原因显然是我的自定义构建步骤调用批处理文件,VS2010创建一个临时批处理文件来执行所有自定义构建文件。 本讨论指出了解决方案: http://social.msdn.microsoft.com/Forums/en-HK/msbuild/thread/ca392036-ebdb-4812-930e-f90aa445cca5 只需使用“call”语句为批处理文件的所有调用添加前缀,从而不会过早地终止主批处理文件的执行。