2016-01-16 38 views
1

所以我一直在研究這種主要編譯程序的每個文件的模塊化編程。假設我們有FILE.c和OTHER.c,它們都在同一個程序中。要編譯它,我們這樣做的提示模塊化編程和編譯linux中的C程序

$gcc FILE.c OTHER.c -c 

使用-c標誌編譯成.o文件(FILE.o和OTHER.o),只有當出現這種情況我們把它翻譯(編譯)使用

$gcc FILE.o OTHER.o -o 

爲可執行文件,我知道我可以做到這一點,跳過中間部分但處處展示,他們首先做的,然後他們把它編譯成可執行文件,這是我無法理解的。

我可以知道爲什麼嗎?

回答

2

在兩個步驟中執行它可以更清楚地分離編譯和鏈接階段。

  • 編制步驟的輸出是屬於機器代碼,但缺少的每個模塊的外部引用(即每個C文件)對象(.o)文件;例如file.c可能會使用other.c中定義的函數,但編譯器不關心該步驟中的依賴關係;

  • 鏈接步驟的輸入是目標文件,其輸出是可執行文件。鏈接步驟通過填充空白(即解析objets文件之間的依賴關係)將目標文件綁定在一起。這也是將庫添加到可執行文件的地方。

1

的另一answer這部分迴應你的問題:

你可能會問,爲什麼有單獨的編譯和鏈接步驟。首先,這樣做可能更容易。編譯器 做了它的事情,並且鏈接器完成它的功能 - 通過保持功能不同,程序的複雜性得以降低。另一個 (更明顯)的優點是,這允許創建大型 程序,而不必在每次更改文件 時重新編譯步驟。相反,使用所謂的「條件編譯」,對於僅編譯那些已更改的源文件而言,必須使用 ;對於其餘的 ,對象文件是鏈接器的足夠輸入。最後,這使得實現預編譯的 代碼庫變得非常簡單:只需創建目標文件並將它們鏈接,就像其他任何 目標文件一樣。 (每個文件從包含在其他文件 信息單獨編譯的事實,順便說一句,被稱爲 「獨立編譯模型」。)

這是太長,加入了註釋,請給予信貸原來的答案。

3

如果您正在使用多個模塊進行項目工作,如果只修改了其中一些模塊,則不需要重新編譯所有模塊。但最終的鏈接命令總是需要的。構建工具,如,使用於跟蹤哪些模塊需要編譯或重新編譯。