2010-06-28 71 views
2

我在使用Unity構建的大型C++項目上工作。對於那些不熟悉這種做法的人來說,Unity會將多個相關的C++實現文件包含到一個大的翻譯單元中,然後將其編譯爲一個。這樣可以節省重新編譯頭文件,縮短鏈接時間,通過將更多功能引入內部鏈接等方式來提高可執行文件的大小/性能。安全統一構建

但是,我剛剛發現了一個潛在的bug。一個實現文件使用的庫不包含關聯的頭文件,但它已編譯並運行。在對我的頭腦進行了一點點修改之後,我意識到它已被包含在我們的統一構建中的這個之前的實現文件中。這裏沒有造成任何傷害,但如果有人試圖獨立後重新使用該文件,可能會令人感到奇怪。

除了定期構建非Unity版本之外,是否有任何方法可以捕獲這些靜默依賴關係,並保持Unity構建的好處?

回答

2

我之前在我們的源代碼庫中使用過UB方法來凍結我們從未計劃再維護的項目。不幸的是,我很確定你的問題的答案是否定的。如果要測試這些類型的錯誤,則必須分別定期構建所有cpp文件。

可能最接近automagic解決方案的是buildbot,它會自動收集項目中的所有cpp文件(除了UB文件)並定期從源代碼庫構建常規方式,指出在此期間的任何構建錯誤。通過這種方式,您的本地開發仍然很快(使用UB),但是您仍然可以捕獲到從使用這些定期buildbot構建的統一構建中錯過的任何錯誤,這些buildbot構建將分別構建所有cpp。

0

我建議不要在您的本地開發環境中使用Unity Build。無論如何編輯和編譯Unity Build都不會幫助您提高編譯時間。使用Unity Build僅適用於您不希望使用該產品的非增量連續構建系統。

只要每個提交在本地編譯之後都發生更改,則不會出現您描述的情況。

Unity Build可能會在本地定義的函數之間形成意外的過載調用,這些函數恰好與重複名稱一起使用。這很危險,你不知道這一點,即在這種情況下不會產生編譯錯誤或警告。除非您有辦法阻止這種情況發生,否則請不要回復Unity Build生成的產品。