MakeFile:
一個工程中的源文件不計其數,按類型、功能、模塊分別放在若干目錄中,makefile定義了一系列的規則來指定,哪些文件需要先編譯,哪些文件需要後編譯,哪些文件需要重新編譯,甚至進行更復雜的操作。因爲makefile就像一個shell腳本一樣,其中也可以執行操作系統的命令。
makefile一旦寫好,只需要一個make命令,整個工程完全自動編譯,極大地提高了軟件開發的效率。其中,make是一個命令,是一個解釋makefile中指令的命令工具,一般來說,大多數IDE都有這個命令,比如:Visual C++的nmake,Linux下GUN的make。可見,makefile已經成爲了一種在工程方面的編譯方法。
一:MakeFile書寫規則
make命令執行時,需要一個Makefile文件,以告訴make命令需要怎麼樣的去編譯和連接工程。
例如我們的工程有8個C文件,和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;
}
步驟: