在Visual Studio中使用自定义构建规则,实现多个输出功能。

3
我们有一个使用自定义对象关系映射系统的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

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


我正在将输出文件添加到构建的主要部分。我的问题是,如果我将.h和.cpp添加到构建中,并且有一个规则说它可以从.tbl生成.h,它会抱怨找不到.cpp,如果我有一个规则说它可以从.tbl生成.cpp,它会说找不到.h。由规则包装的工具生成两者,但我似乎无法弄清楚如何配置规则来告诉它。 - Jeff Dege
<CustomBuildRule Outputs>的文档中可以看出,你可以用分号将多个文件列在一起。 - sblom

0
sblom 给出的答案是正确的,但它没有解释原因。
对于每个构建规则(自定义或本地),VS 构建系统需要知道完整的输入和输出列表,以便它可以决定需要构建项目的哪个部分。
您的构建规则将生成的 .cpp 文件声明为输出,因此 VS 知道它并将自动为您构建此文件。由于您省略了头文件,因此 VS 不知道它,因此包括此头文件的任何源文件都不知道从哪里获取它,并且无法构建。在这种情况下使构建工作的一种方法是将包含此 .h 文件的目录添加到您的包含路径中,然后 #include 此文件将起作用。基本上,您正在以不同的方式启用 VS 知道此文件。
相反,如果您更改构建规则以将头文件声明为输出,则包含它的源文件将知道从哪里获取此文件,但现在 VS 不知道您的 .cpp 文件,因此它不会构建它。在这种情况下的解决方法是将生成的 .cpp 文件明确添加到您的项目中作为源文件。与上述情况类似,您正在使用技巧使构建系统识别生成的文件。

但是,虽然上述解决方法可以让您继续进行工作,但它们并不是最佳解决方案,因为它们只是弥补了VS不知道文件的情况。解决此问题的最佳方法是在规则中将.cpp和.h文件都声明为输出文件,并用分号隔开。这将使VS能够对两个文件应用正确的行为。


抱歉回复晚了。我被调到另一个项目上了。当我将.h和.cpp文件都指定为输出文件时,VS没有报错,但似乎无法正确连接依赖项。也就是说,它仍然尝试编译.cpp文件,而这些文件包含了尚未构建的生成的.h文件。 - Jeff Dege

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接