1. 程式人生 > >linux中make命令的簡單使用以及Makefile檔案的書寫

linux中make命令的簡單使用以及Makefile檔案的書寫

Makefile

    會不會寫makele,從一個側面說明了一個是否具備完成大型工程的能力。

    一個工程中的源件不計數,其按型別、功能、模組分別放在若干個目錄中,makele定義了一系列的規則來指定,哪些檔案需要先編譯,哪些檔案需要後編譯,哪些檔案需要重新編譯,甚至於進行更復雜的功能操作,因為makele就像一個Shell指令碼一樣,其中也可以執行作業系統的命令。makele帶來的好處就是“自動化編譯”,一旦寫好,只需要一個make命令,整個工程完全自動編譯,極大的提高了軟體開發的效率。 make是一個命令工具,是一個解釋makele中指令的命令工具,makele成為了一種在工程方面的編譯方法。

一、關於程式的編譯和連結

    一般來說,無論是CC++、還是 pas,首先要把原始檔編譯成中間程式碼檔案,在Windows下也就是 .obj 檔案,UNIX下是 .o 檔案,即 Object File,這個動作叫做編譯(compile)。然後再把大量的Object File合成執行檔案,這個動作叫作連結(link)。

    make命令執行時,需要一個 Makele 檔案,以告訴make命令需要怎麼樣的去編譯和連結程式。

Makele的書寫規則:

    1.如果這個工程沒有編譯過,那麼我們的所有C檔案都要編譯並被連結。

    2.如果這個工程的某幾個C檔案被修改,那麼我們只編譯被修改的C檔案,並連結目標程式。

    3.如果這個工程的標頭檔案被改變了,那麼我們需要編譯引用了這幾個標頭檔案的C檔案,並連結目標程式。

    在定義好依賴關係後,後續的那行定義瞭如何生成目標檔案的作業系統命令,一定要以一個Tab鍵作為開頭(make並不管命令是怎麼工作的,他只管執行所定義的命令。)。

二、 Make是如何工作

    1、make會在當前目錄下找名字叫“Makele”或“makele”的檔案;

    2、如果找到,它會查詢檔案中的第一個目標檔案.o

    3、如果檔案不存在,它會根據依賴關係查詢.s檔案;

    4、若.s檔案不存在,make會在當前檔案中查詢.s檔案的依賴檔案.i;    

    5、若.i檔案不存在,會根據依賴關係查詢.c檔案,當然.c檔案是存在的,於是,make會生成一個.o檔案,然後去執行檔案。

    這就是整個make的依賴性,make會一層又一層地去找檔案的依賴關係,直到最終編譯出第一個目標檔案。在找尋的過程中,如果出現錯誤,比如最後被依賴的檔案找不到,那麼make就會直接退出,並報錯,而對於所定義的命令的錯誤,或是編譯不成功,make根本不理。make只管檔案的依賴性,即如果在我找了依賴關係之後,冒號後面的檔案還是不在,那麼make就不工作啦。

三、清空目標檔案的規則

    每個Makele中都應該寫個清空目標檔案(.o和執行檔案)的規則,這不僅便於重編譯,也很利於保持檔案的清潔。

    一般格式:

 .PHONY : clean        

 clean :               

 -rm -f 檔案

    .PHONY意思表示clean是個“偽目標”,而在rm命令前面加了一個小減號的意思就是:也許某些檔案出現問題,但不要管,繼續做後面的事。當然,clean的規則不要放在檔案的開頭,不然,就會變成make的預設目標。

    例如為建立一個進度條(後邊詳細講解)的程式(test.c)編寫一個Makefile檔案,並在Makefile檔案下編輯如下:

    格式1:

wKioL1dKnwOA9QS7AAAg5YLxgCU007.png-wh_50

    (注意:如果按格式1寫Makefile檔案,需要將每行開頭處的‘#’刪除掉,此為註釋符)

    格式2:

wKiom1dKnifSSkrnAAAXESlqQAU392.png-wh_50

    執行該檔案效果如下:

wKioL1dKn2zBtOSXAAAYvmLWsbQ128.png-wh_50

清除Makefile產生的多餘檔案make  clean

wKiom1dKnpuy2SaeAAAZ7XZuTRo612.png-wh_50

    注:

    1、編寫依賴方式時,一定要以Tab鍵開頭(不能用空格代替)

    2、clean一般都放在檔案的最後

    3、@可以遮蔽輸出依賴方式

    4、makefile 預設值生成一個目標檔案,就停止

   linux下編寫一個簡單的進度條

    進度條實現原理:

1)實現動態的增長

    定義一個數組,並設定一個計數器,當數字增加的同時,給字元陣列每次增加一個元素,並且列印時覆蓋之前的陣列。

2)保證列印資訊輸出在一行

    每次將游標定位在最左邊,從標處列印,使用‘\n’,回車

3)複製動態的效果實現

    定義一個數組

     char *index = -/|\\;

    輸出時index[count%4];

4)實現列印長度相同

    %-100s

5)給人複製的效果

    程式每輸出一次,程式掛起一段時間

     程式碼如下:

wKiom1dKn_LQ7MphAABwFz0ma6g554.png-wh_50

    執行效果如下:

wKiom1dKoBiA1p7kAAAkRO48UFA170.png-wh_50

wKiom1dKoBjSnKLhAAAo-QrUwQ0669.png-wh_50