linux中make命令的簡單使用以及Makefile檔案的書寫
Makefile
會不會寫makele,從一個側面說明了一個是否具備完成大型工程的能力。
一個工程中的源件不計數,其按型別、功能、模組分別放在若干個目錄中,makele定義了一系列的規則來指定,哪些檔案需要先編譯,哪些檔案需要後編譯,哪些檔案需要重新編譯,甚至於進行更復雜的功能操作,因為makele就像一個Shell指令碼一樣,其中也可以執行作業系統的命令。makele帶來的好處就是“自動化編譯”,一旦寫好,只需要一個make命令,整個工程完全自動編譯,極大的提高了軟體開發的效率。 make是一個命令工具,是一個解釋makele中指令的命令工具,makele成為了一種在工程方面的編譯方法。
一、關於程式的編譯和連結
一般來說,無論是C、C++、還是 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:
(注意:如果按格式1寫Makefile檔案,需要將每行開頭處的‘#’刪除掉,此為註釋符)
格式2:
執行該檔案效果如下:
清除Makefile產生的多餘檔案make clean
注:
1、編寫依賴方式時,一定要以Tab鍵開頭(不能用空格代替)
2、clean一般都放在檔案的最後
3、@可以遮蔽輸出依賴方式
4、makefile 預設值生成一個目標檔案,就停止
在linux下編寫一個簡單的進度條
進度條實現原理:
1)實現動態的增長
定義一個數組,並設定一個計數器,當數字增加的同時,給字元陣列每次增加一個元素,並且列印時覆蓋之前的陣列。
2)保證列印資訊輸出在一行
每次將游標定位在最左邊,從光標處列印,使用‘\n’,回車
3)複製動態的效果實現
定義一個數組
char *index = “-/|\\”;
輸出時index[count%4];
4)實現列印長度相同
%-100s
5)給人複製的效果
程式每輸出一次,程式掛起一段時間
程式碼如下:
執行效果如下: