linux下編譯C程式

來源:互聯網
上載者:User

GCC起步
  在學習使用GCC之前,下面的這個例子能夠協助使用者迅速理解GCC的工作原理,並將其立即運用到實際的項目開發中去。首先用熟悉的編輯器輸入清單1所示的代碼: 
  清單1:hello.c 
#include 
int main(void)
{
printf ("Hello world, Linux programming!\\n");
return 0;
}
然後執行下面的命令編譯和運行這段程式: 
# gcc hello.c -o hello
# ./hello
Hello world, Linux programming!
從程式員的角度看,只需簡單地執行一條GCC命令就可以了,但從編譯器的角度來看,卻需要完成一系列非常繁雜的工作。首先,GCC需要調用預先處理程式 cpp,由它負責展開在源檔案中定義的宏,並向其中插入“#include”語句所包含的內容;接著,GCC會調用ccl和as將處理後的原始碼編譯成目標代碼;最後,GCC會調用連結程式ld,把產生的目標代碼連結成一個可執行程式。 
  為了更好地理解GCC的工作過程,可以把上述編譯過程分成幾個步驟單獨進行,並觀察每步的運行結果。第一步是進行先行編譯,使用-E參數可以讓GCC在預先處理結束後停止編譯過程: 
# gcc -E hello.c -o hello.i
此時若查看hello.cpp檔案中的內容,會發現stdio.h的內容確實都插到檔案裡去了,而其它應當被預先處理的宏定義也都做了相應的處理。下一步是將hello.i編譯為目標代碼,這可以通過使用-c參數來完成: 
# gcc -c hello.i -o hello.o
GCC預設將.i檔案看成是預先處理後的C語言原始碼,因此上述命令將自動跳過預先處理步驟而開始執行編譯過程,也可以使用-x參數讓GCC從指定的步驟開始編譯。最後一步是將產生的目標檔案連結成可執行檔: 
# gcc hello.o -o hello
在採用模組化的設計思想進行軟體開發時,通常整個程式是由多個源檔案組成的,相應地也就形成了多個編譯單元,使用GCC能夠很好地管理這些編譯單元。假設有一個由foo1.c和foo2.c兩個源檔案組成的程式,為了對它們進行編譯,並最終產生可執行程式foo,可以使用下面這條命令: 
# gcc foo1.c foo2.c -o foo
如果同時處理的檔案不止一個,GCC仍然會按照預先處理、編譯和連結的過程依次進行。如果深究起來,上面這條命令大致相當於依次執行如下三條命令: 
# gcc -c foo1.c -o foo1.o
# gcc -c foo2.c -o foo2.o
# gcc foo1.o foo2.o -o foo
在編譯一個包含許多源檔案的工程時,若只用一條GCC命令來完成編譯是非常浪費時間的。假設項目中有100個源檔案需要編譯,並且每個源檔案中都包含 10000行代碼,如果像上面那樣僅用一條GCC命令來完成編譯工作,那麼GCC需要將每個源檔案都重新編譯一遍,然後再全部串連起來。很顯然,這樣浪費的時間相當多,尤其是當使用者只是修改了其中某一個檔案的時候,完全沒有必要將每個檔案都重新編譯一遍,因為很多已經產生的目標檔案是不會改變的。要解決這個問題,關鍵是要靈活運用GCC,同時還要藉助像Make這樣的工具。 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.