2011-09-15 54 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文件。 –

相關問題