回答

5

它是有用的,以減少重建時間。如果只更改一個源文件 - 通常不需要重新編譯整個項目,而只需要一個或幾個文件。

0

實際上,這根本不重要。特別是對於比較簡單的程序,這兩個步驟都用一個程序調用,如

gcc f1.c f2.c f3.c f4.c -o program 

它創建從這些源文件的可執行program執行。

但事實是這些都是單獨的過程,在某些情況下值得注意。

2

因爲編譯負責將每個源代碼文件的源代碼轉換爲相應的目標代碼。而已。所以編譯器不必關心你的外部符號(如庫和變量)。

鏈接負責找到這些引用,然後生成一個單獨的二進制文件,就像您的項目被編寫爲單個源代碼文件一樣。 (我也建議你應該參考維基百科linking頁面瞭解靜態和動態鏈接之間的differnce)

如果你碰巧使用該工具Make,你會看到,當你調用make它不會重新編譯每一個文件,它會查找自上次構建以來哪些文件已被修改,然後僅重新編譯它們。然後調用鏈接過程。當你處理大型項目(例如linux內核)時,這是一個很大的節省時間。

2

這些日子可能不像以前那麼重要。

但是有一段時間編譯項目可能需要幾天的時間 - 我們過去在80年代的一個週末做了一個「完整構建」。僅僅解析單個文件的源代碼是一件相當大的事,需要大量的時間和內存,所以設計語言的目的是爲了使它們的模塊(源文件)能夠被隔離處理。

,結果是「目標文件」 - .obj(DOS/Windows的/ VMS)和.o(UNIX)文件 - 包含的重定位代碼,靜態數據,和(我們​​定義的對象)出口的列表和進口(我們需要的物品)。鏈接階段將所有這些集中到一個可執行文件中,或者粘貼到一個存檔中(.lib,.a,.so,.dll文件等)以供進一步包含。

讓昂貴的編譯任務獨立運作,帶動了像make這樣複雜的增量構建工具的生成,這些工具顯着提高了編程人員的生產力 - 對於大型C項目(如Linux內核)仍然至關重要。

它也很有用,意味着任何可以編譯成目標文件的語言都可以鏈接在一起。因此,通過一點點努力,可以將C連接到Fortran,將COBOL連接到C++等等。

自從那些日子以來,開發了許多語言已經推動了可以存儲在目標文件中的內容的邊界。C++模板系統需要特殊處理,並且重載方法不太適合,只要.o文件不支持具有相同名稱的多個函數(請參閱C++ name mangling)。 Java等人使用完全不同的方法,使用自定義代碼文件格式和粘貼到DLL和共享對象文件的「本地代碼」調用機制。

0

我已經在需要兩天編譯它們的系統上工作過。你不想做一個小的改變,然後必須等待2天才能測試。