2010-09-21 138 views
2

假設我有一堆C++文件:A.cc,B.cc,C.cc和它們相關的頭文件。 A.cc使用B.cc中的類等等。源代碼依賴關係

現在說我想構建源文件。預處理階段結束後,理論上可以同時編譯(不鏈接)所有文件嗎? (A.cc - > A.obj,...)

我只是想知道是否有一段時間,我將不得不等待,直到我編譯B.cc之前完成編譯A.cc。

回答

8

不,除非你正在做一些怪異事實上,B.cc彙編將依賴於編譯A.cc(反之亦然)的結果。這就是爲什麼make -j(同時運行多個「作業」,即並行進程,每次編譯文件在同一時間)是一個流行的用法,尤其是當然在多核機器上(但不是僅限於那些,因爲即使沒有多個內核少量同時工作可能最終完成速度比任意序列化的同一組作業更快 - 一個可能被阻塞等待磁盤I/O,而另一個則導致CPU密集型編譯部分。 ..)...只要你有足夠的可用物理RAM,那是;-)。

0

這是頭文件的用途,對吧? make -j N會爲你做這件事,雖然它會根據用戶生成的Makefile來判斷。

-1

文件尾部的擴展名或多或少沒有意義。重要的是,即使尚未實現,您仍然對所有要編譯的類都有完整的定義。由於.h和.cc或.cpp擴展名是任意的,因此最重要的是文件的內容。

一般來說,如果你能夠完全描述該類的一個對象,那麼你將不會遇到問題。如果類定義在您設置的鏈中不存在(可能會發生循環相關的標頭),那麼您必須做一些魔術。

的一點是,它真的取決於你的設計/開發人員,如果你會碰到這個問題

+0

因爲你說的沒有什麼是錯誤的,所以你很難找到你說的任何話的錯。但最後,你什麼也沒說。 – 2010-09-21 05:22:17

+0

@John如果你將問題回答爲「是」,那麼這聽起來像是一個永遠無法解決的常見問題。如果你回答爲「否」,那麼你錯了,因爲你可以注入一個依賴到一個源文件構建(亞歷克斯稱它「真奇怪」,這將導致問題。因此,我對如何避免依賴關係做了非常非常簡短的解釋,但重點關注的是開發人員而不是編譯人員解決此問題的事實。請注意,我不是在尋找任何人來改變他們的失敗行爲,我只是在解釋我來自哪裏。 – 2010-09-21 12:15:50

+0

FWIW這不是我的失望 – 2010-09-21 13:00:33

0

只有一種情況下你真的想這樣的關係:當一個文件生成C++代碼,稍後編譯。 Make具有足夠的靈活性來支持這一點。但是當你想到你的常規項目時,不,你不需要,也不應該有這樣的依賴。