MakeFile

MakeFile:       

         一個工程中的源文件不計其數,按類型、功能、模塊分別放在若干目錄中,makefile定義了一系列的規則來指定,哪些文件需要先編譯,哪些文件需要後編譯,哪些文件需要重新編譯,甚至進行更復雜的操作。因爲makefile就像一個shell腳本一樣,其中也可以執行操作系統的命令。

        makefile一旦寫好,只需要一個make命令,整個工程完全自動編譯,極大地提高了軟件開發的效率。其中,make是一個命令,是一個解釋makefile中指令的命令工具,一般來說,大多數IDE都有這個命令,比如:Visual C++nmakeLinuxGUNmake。可見,makefile已經成爲了一種在工程方面的編譯方法。

         一:MakeFile書寫規則

         make命令執行時,需要一個Makefile文件,以告訴make命令需要怎麼樣的去編譯和連接工程。

         例如我們的工程有8C文件,和3個頭文件,我們要寫一個MakeFile來告訴make命令如何編譯和連接這幾個文件。規則是:

           1)如果這個工程沒有編譯過,那麼我們所有C文件都要編譯並被鏈接。

           2)如果這個工程的某幾個C文件被修改,那麼我們只編譯被修改的C文件,並鏈接目標工程。

           3)如果這個工程的頭文件被改變了,那麼我們需要編譯引用了這幾個頭文件的C文件,並鏈接目標程序。

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

          二:make是如何工作的

          默認方式下,我們只輸入make命令。那麼:

           1 make會在當前目錄下找名字叫"Makefile""makefile"的文件。

           2)如果找到,它會找文件中的第一個目標文件(target)。

           3)如果第一個目標文件不存在,或者目標文件所依賴的後面的.o文件的文件修改時間要比目標文件新,那麼,它會執行後面所定義的命令來生成這個目標文件。

           4)如果目標文件所依賴的.o文件也存在,那麼make會在當前文件中找目標爲.o文件的依賴性,如果找到則再根據那一個規則生成.o文件。(有點像一個堆棧的過程)

           5)當然,你的C文件和H文件是存在的,於是make會生成.o文件,然後再用.o文件聲明make的終極任務,就是執行目標文件了。

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

    clean這種,沒有被第一個目標文件直接或間接關聯,那麼它後面所定義的命令將不會被自動執行,不過我們可以顯示要make執行。make clean”,以此來清除所有的目標文件,以便重編譯。

     三:清空目標文件的規則

     每個Makefile中都應該寫一個清空目標文件(.o和執行文件)的規則,不僅便於重編譯,也利於保持文件的清潔。

     一般的風格都是:

     clean:

          rm edit $(objects)

     更爲穩健的做法是:

     .PHONY:clean

     clean

          -rm edit $(objects)

     其中,.PHONY意思是表示clean是一個“僞目標”。而在rm命令前面加了一個小減號的意思是,也許某些文件出現問題,但不要管,繼續做後面的事。當然,clean的規則不要放在文件的開頭,不然,就會變成make的默認目標。不成文的規矩是:“clean從來都是放在文件的最後”。

        僞目標一般沒有依賴的文件。但是,我們也可以爲僞目標指定所依賴的文件。僞目標同樣可以作爲“默認目標”,只要將其放在第一個。

     四:進度條

源程序:

     #include<stdio.h>

#include<string.h>

 

void proc()

{

         int count = 0;

         char buf[102];

         memset(buf, '\0', sizeof(buf));

         constchar *lable = '|/-\\';

         while (count <= 100)

         {

                   buf[count] = '#';

                   printf("[%-100s][%d%%][%c]\r",buf,count++,lable[count%4]);

                   fflush(stdout);

                   usleep 10000;

         }

         printf("\n");

}

int main()

{

         proc();

         return 0;

}

步驟:

 

wKioL1dRM4-jx8GNAAL5lK4Lzvw182.png-wh_50

wKioL1dRM5CTJhCzAAKGSgmlNEI877.png-wh_50

wKiom1dRMpDSKUjpAAJxXTPJiuw576.png-wh_50

wKioL1dRM5PCxyDeAAJ9fsvTi14473.png-wh_50

wKiom1dRMpKBeKLuAAKO1UET5HI388.png-wh_50

 

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