天天看點

Linux gcc編譯器

Linux作業系統認識的語言是二進制檔案。具體的從程式設計到執行的過程是:首先利用進階語言(例如c語言)在文本編輯器(例如vim)寫好源程式,再利用編譯器(例如gcc)進行編譯,再連結到已存在的函數庫,最終産生可以執行的可執行檔案。如圖:

Linux gcc編譯器

下面對c語言代碼編譯來逐漸了解如何利用gcc編譯程式

1.單個程式

<a></a>

看看編譯過程:

Linux gcc編譯器

可以指定可執行檔案的名稱。有兩個參數重要的參數 -c——生成目标檔案(.o檔案)  -o——生成可執行檔案。看下面執行過程

Linux gcc編譯器

2.多個程式

Linux gcc編譯器

問題來了:既然可以直接生成可執行檔案,那為嘛要生成那中間的目标檔案(.o)?

原因是這樣的:當源碼檔案有很多時,編譯大量的源碼檔案需要大量的時間,但是如果生成目标檔案的話,就可以在編譯的時候隻編譯改變的目标檔案。

3.調用函數庫

Linux gcc編譯器

看到程式出現錯誤,說沒有定義sqrt。此時頭檔案#include&lt;math.h&gt;是無濟于事的。因為檢視/usr/include/目錄下的math.h沒有對sqrt()的定義。C語言的數學函數大部分寫在libm.so函數庫中,此函數庫主要放在/lib、/usr/bin.是以要在編譯時的連結過程

聲明:-L/lib、-L/usr/lib

Linux gcc編譯器

4.makefile檔案

現在問題又來了:為了以後修改不至于大幅度的編譯源檔案,生成了目标檔案,但是有大量的目标檔案,那不有大量的gcc -c .......很麻煩,為了比比按這種重複的工作,就要用的了makefile(Makefile)檔案。還是利用2中的例子。編寫makefile如下

編譯過程:

Linux gcc編譯器

編寫makefile規則:

注意:第二行開頭一&lt;tab&gt;鍵開頭,顔色是高亮的。

5.優化makefile檔案

在書寫makefile時可以看到有很多重複的内容,這樣就可以把重複的内容用一個變量代替。例如上邊的makefiel可以改寫如下:

注意:

變量常用大寫表示

此時變量指派可以有空格(不像shell)

下邊調用變量的時候用格式${OBJS}

數學函數不要在gcc 最後竹山 -lm

$@可以表示目前的可執行檔案名稱,那麼上邊的makefile改寫如下:

本文轉自jihite部落格園部落格,原文連結:http://www.cnblogs.com/kaituorensheng/archive/2013/03/27/2983888.html,如需轉載請自行聯系原作者