2013-11-25 13 views
0

我正在學習C,我剛剛閱讀術語多個編譯。
到目前爲止我只有一個file.c,我用命令gcc file.c來編譯它,然後使用./a.out來執行它。但我有點困惑。什麼時候應該使用多個編譯而不是單個,哪個可能會導致我更喜歡多個編譯而不是單個編譯?

我搜索了它,發現了一些文章,但他們沒有完全覆蓋我的問題。 1 (this is for c++)2

如果我undestood好,如果我有一些files.c在我的項目如在file1.c,file2.c中,然後我想將它們連接,我執行什麼是多重彙編,如何工作以及爲什麼我應該使用它?

gcc file1.c 
gcc file.c 
gcc file1.o file2.o //somehow i have to create the .o files.. 

謝謝。

+0

'.o'文件是對象。他們已經編譯好代碼。你需要將它們鏈接成一個可執行文件 –

+0

'gcc -c'會創建'.o'文件。 –

回答

1

編譯有許多步驟。

當你調用gcc默認情況下將一氣呵成創建一個可執行文件,即所有的步驟:

  • .c - >.i預處理
  • .i - >.s編譯
  • .s - >.o彙編
  • *.o - >a.out鏈接器

一般情況下,前兩種佔用時間最多。如果您有一個大型項目,那麼在您開發時重新編譯整個項目可能需要很長時間。所以編譯器允許你停止在某一點和重複使用的文件的先前結果並沒有改變:

  • gcc -E用於預處理只(很少使用)
  • gcc -S編譯,但不彙編。用於調試或優化組件
  • gcc -c編譯,彙編但不鏈接。這是最常用的一種,並生成目標文件。這些包含您的組裝功能(目標代碼),但它並不能夠運行,因爲並非所有的功能可能存在的是,庫函數失蹤,可執行標頭未在被鏈接的。

的最後一步gcc -o executable *.o會然後將所有這些並將它們鏈接在一起創建一個可執行文件。可選將庫鏈接到它。

通常,在一個源文件中包含所有函數將允許編譯器進行更多優化(即內聯),但代價是編譯時間。

看看https://cs.senecac.on.ca/~btp200/pages/images/compile_link.png

+0

還有一點,'makefile'命令與我的問題類似? @SergeyL。 – yaylitzis

+0

@ Nat95我不明白這個問題。如果你指的是GNU'make',那麼這是一個完全不同的話題。這是一個程序,可以爲您自動執行一些編譯步驟。我建議你搜索GNU make並閱讀文檔,如果你有興趣的話。 –

+0

好的!謝謝! @SergeyL。 – yaylitzis

2

編譯需要時間。重新編譯沒有改變的C代碼沒有意義。因此,對於大型項目來說,將代碼拆分爲多個文件(當然,通常不是隨機的,而是包含不同功能的模塊)並且僅在需要時才進行編譯。

鏈接是將一堆目標代碼(調用.o文件)並將它們轉換爲單個程序的過程。

+0

還有一點,'makefile'命令跟我的問題類似嗎? @unwind – yaylitzis

相關問題