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)給人複製的效果
程序每輸出一次,程序掛起一段時間
代碼如下:
運行效果如下: