2011-09-15 24 views
2

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

我试图让一个自定义生成规则为这方面的工作,在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”,我仍然得到错误。

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

任何想法?

回答

0

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

+0

我将输出文件添加到构建的主要部分。我的问题是,如果我将.h和.cpp添加到构建中,并且有一条规则说它可以从.tbl生成.h,它会抱怨它找不到.cpp,如果我有规则说它可以从.tbl生成一个.cpp,它说它找不到.h。由规则包装的工具同时生成,但我似乎无法弄清楚如何配置一个规则来告诉它。 –

+0

从''的文档中,听起来您可以列出以分号分隔的多个文件。 – sblom

0

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

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

您的构建规则将生成的.cpp文件声明为输出,所以VS知道它,并会自动为您生成该文件。由于你省略了头文件,VS不知道它,所以包含这个头文件的任何源文件都不知道从哪里得到它并且无法构建。解决此问题的方法是将此.h文件所在的目录添加到包含路径中,然后包含此文件将可以工作。你基本上是让VS以不同的方式了解这个文件。相反,如果您更改构建规则以声明头文件作为输出,那么包含它的源文件将知道从哪里获取此文件,但现在VS不知道您的.cpp文件,因此它赢得了'建立它。解决此问题的方法是将生成的.cpp文件作为源文件明确添加到项目中。就像在上面的例子中一样,你使用一个技巧来让构建系统识别生成的文件。

虽然上面的解决方法可以帮助您解决问题,但它们并不是最好的解决方案,因为它们只是补偿VS不知道文件。解决此问题的最佳方法是将.cpp和.h文件声明为规则中的输出,并用分号分隔它们。这将使VS能够将正确的行为应用于这两个文件。

+0

对不起,花了这么长的时间回到这个。我被拉到另一个项目。当我将.h和.cpp指定为输出文件时,VS不会发出抱怨,但它似乎没有正确连接依赖关系。也就是说,它仍然会尝试编译.cpp文件,这些文件包含生成的尚未构建的.h文件。 –

相关问题