Visual Studio中的自定义构建规则,具有多个输出

时间:2011-09-15 15:41:24

标签: visual-studio custom-build-step

我们有一个使用自定义对象关系映射系统的C ++项目,其中表由.tbl文件定义。然后通过代码生成器运行这些代码生成器,为每个文件生成.h和.cpp文件。

我正在尝试在Visual Studio 2008和2010中使用自定义构建规则。

到目前为止,这就是我所拥有的:

<?xml version="1.0" encoding="utf-8"?>
<VisualStudioToolFile
    Name="z_dbbld"
    Version="8.00"
    >
    <Rules>
        <CustomBuildRule
            Name="z_dbbld"
            DisplayName="z_dbbld"
            CommandLine="$(SolutionDir)\tools\z_dbbld $(InputName)"
            Outputs="$(InputName).cpp"
            FileExtensions="*.tbl"
            ExecutionDescription="z_dbbld  $(InputName)"
            >
            <Properties>
            </Properties>
        </CustomBuildRule>
    </Rules>
</VisualStudioToolFile>

问题是依赖关系。当我在没有文件存在的干净结账时运行构建时,对于由此规则生成的.h文件,我得到“无法打开包含文件”错误。

我尝试将输出更改为“$(InputName).h”,但我仍然会收到错误。

现在的问题是,代码生成器运行时会创建这些文件。如果我再次编译,我没有错误,因为所有文件都是在第一次传递中创建的。但它使得从清新结账做一个干净,自动化的构建不起作用。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

我认为你需要在构建的主要部分指定输出文件(查看http://msdn.microsoft.com/en-us/library/hefydhhy.aspx的最后一句)。可能最简单的方法是在文件存在时添加对文件的引用,然后删除它们,看看codegen步骤是否应该运行。

答案 1 :(得分:0)

sblom给出的答案是正确的,但它没有解释原因。

对于每个构建规则(自定义或本机),VS构建系统需要知道输入和输出的完整列表,以便它可以决定需要构建项目的哪个部分。

您的构建规则将生成的.cpp文件声明为输出,因此VS了解它并将自动为您构建此文件。由于您省略了头文件,因此VS不知道它,因此包含此头文件的任何源文件都不知道从哪里获取它并且无法构建。在这种情况下使构建工作的工作是将此.h文件所在的目录添加到包含路径,然后此文件的#includes将起作用。你基本上是让VS以不同的方式了解这个文件。

相反,如果您更改构建规则以将头文件声明为输出,那么包含它的源文件将知道从哪里获取此文件,但现在VS不知道您的.cpp文件,因此它不会建立它。解决此问题的方法是将生成的.cpp文件显式添加到项目中作为源文件。与上面的情况一样,您正在使用一种技巧来使构建系统识别生成的文件。

但是虽然上面的解决方法会让你继续前进,但它们并不是最好的解决方案,因为它们只能弥补VS不知道文件。解决此问题的最佳方法是将.cpp和.h文件声明为规则中的输出,并用分号分隔它们。这将使VS能够对两个文件应用正确的行为。