2013-03-04 86 views
6

我對編譯和構建的區別有一個理論問題。我正在編寫一個需要花費大量時間構建的C++項目,所以我告訴我只是在「我修改了任何頭文件」的情況下進行構建。真的嗎?如果我在headder文件中添加一個新屬性,那麼我是否必須構建?編譯不夠?構建或編譯

謝謝!

+0

你必須建立它。但IDE或製作工具只會構建需要構建的obj,lib和exe。 – neohope 2013-03-04 09:58:32

+0

編譯和構建是一樣的。基本上你重新編譯源代碼文件並鏈接它們生成的目標文件來構建新的可執行文件或lib。當你改變一些頭文件時,包含這個頭文件的源文件必須重新編譯和鏈接以形成新的構建文件(可執行文件或lib文件),這將反映你在頭文件中所做的更改。這種依賴關係的規則必須在項目的makefile中。 – 2013-03-04 10:03:43

回答

14

「建築」是一個模糊的術語,通常意味着整個過程,預處理,編譯和鏈接。源更改後必須重做這些進程的哪些部分取決於發生了什麼變化。如果您只更改了一個源,則重新編譯它並重新鏈接對象就足夠了。如果更改.h標頭,則全部包含此標頭的源文件必須重新編譯,這通常很昂貴,因爲項目特定的標頭往往會包含在許多源文件中。

總之,如果你已經做了更改消息來源稱,受此影響的所有文件必須重新編譯和整個二進制必須被重新鏈接。

1

生成是將源代碼轉換成一個可執行,對於C的完整過程++編譯的源代碼轉換爲目標代碼。在構建中,C++代碼將被編譯,然後您將需要其他階段,包括鏈接階段來構建可執行文件。構建還可以涉及其他步驟,例如預編譯或在編譯之前生成源代碼文件。

只是在「我修改了任何頭文件」的情況下,做一個構建僅僅意味着只有包括(直接或通過其他包含的文件)文件進行編譯,然後將所有對象鏈接。 Ina「全部」構建所有文件將被編譯,這樣可以減少要編譯的文件數量並縮短總體構建時間。

如果更改一個頭文件,那麼你必須建立,編制將只需要創建一個新的對象文件還不是可執行文件的一部分。

5

編譯爲高電平代碼轉換爲機器代碼級

大廈是高級語言轉換成可執行的進程的進程。這將涉及編譯和鏈接。

在頭文件進行修改的情況下,頭文件可能會影響到幾個C++文件,從而讓你需要構建它最終的可執行

有單獨編譯,因爲它不會產生沒有用最終可改變,因此你需要始終構建。

+2

我不同意最後一個 - **編譯單獨有一個使用** - 有時你需要編譯來檢查代碼是否有效編譯 - 你不需要編譯,因爲你的應用程序還沒有準備好.. 或該部分只是不打算直接爲EXE輸出... – 2015-02-18 16:55:06

0

編譯只是構建中的一個步驟。無論何時您需要重新編譯,您都需要重新編譯。

編譯只是需要的源文件和其包含的頭文件,並且生成用於每個源文件的目標文件。 Building還將這些文件鏈接在一起以創建可執行文件。所以如果你改變一個源文件,你需要編譯,如果你想要一個新的可執行文件來測試。編譯只會讓你分開。

0

我不知道我完全理解你的問題。編譯只是構建過程的一部分(包括預處理,編譯,鏈接以及可能的其他部分)。它創建鏈接器然後鏈接到可執行文件的目標文件,所以只有編譯是不夠的。如果你的問題是真的是否應該運行你的軟件的完整版本,那麼有時你不必如果你只改變了實現(.cpp)文件,但如果你也改變了聲明(即頭文件)那麼你很可能需要這樣做。無論如何,你將不得不完全構建受影響的組件 - 而不僅僅是編譯它。

6

編譯是將源代碼轉換爲目標代碼的行爲。

鏈接是將目標代碼與庫結合到原始可執行文件中的行爲。

Building是由編譯和鏈接組成的序列,可能還有其他任務,如安裝程序創建。從What is the difference between compile code and executable code?

採取

因此,您只需要(重新)編譯對象的代碼,舊的(「已編輯最近」)比源文件鏈接包含可執行程序中的最新更改。實際上,這是make決定是否構建文件的方式。