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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章