我們都知道程序在執行之前會有兩個很重要的過程:編譯和鏈接。當然我們在Windows平臺的編譯器中(像vs),它會自動幫我們生成最後的執行程序,如(xxx.exe);但是Linux下我們使用vim時,gcc和g++是可以一次性將一個源代碼生成可執行程序,可是一個項目可不止一個源文件,一個項目的運作是要將各個源代碼編譯成目標文件後,再將它們鏈接起來後執行的。
試想一下如果一個工程有上百個源文件,那你將所有源文件都編譯鏈接完後,程序也能跑起來,然後你的boss不滿意,讓你修改幾處地方,然後你改完之後又得在寫一遍,好不容易寫完,他還是不樂意,然後你又得寫一遍......其實這裏你大部分時間都被浪費在無用功上,那些編譯和鏈接的命令其實只要寫一遍就好,每回改完只要叫它們再運行一次就好。
而make和Makefile就是可以解決這樣的問題,你將你的編譯和鏈接命令寫入Makefile中,每回運行的時候執行一下make命令,它就會把你的執行程序給生成出來。如果你要修改的話,那你只要修改完之後在執行下make命令即可,是不是很方便?(嘿嘿),其實學會了make和Makefile的使用對你對編程的學習效率和以後工作效率都有很大幫助,下面來看看它們使用方法吧:
我已進度條這個小程序爲例,關於進度條大家肯定不陌生,只要是上過網的都見過,它的代碼原理也很簡單,我讓它每過一個規定的時間,就刷新一個'#',後面跟上百分比。刷新的時候只在當前行,所以每次要回車,代碼如下:
#include<stdio.h> #include<string.h> void proc() { char str[102]; char s[]={'|','/','-','\\'}; memset(str,'\0',sizeof(str)); int count=100; int i=0; for(;i<=count;++i) { str[i]='#'; printf("[%-100s][%d%%][%c]\r",str,i,s[i%4]); usleep(100000); fflush(stdout); } printf("\n"); return; } int main() { proc(); return 0; }
結果由於是動態的,這裏不好發圖,就不展示了,我們還是看後面的Makefile怎麼編寫吧,這纔是重點。
上面是一個已經寫好的源文件叫proc.c,它生成應用程序proc要經過下面的過程:
Makefile的編寫要把握住兩個點:依賴關係和依賴方法
就那上面的程序來說,我們最後要生成proc的程序,proc要通過proc.o來生成,可是現在沒有proc.o,所以就在往後看proc,o是由proc.s生成,接着往下推就會發現我們推到peoc.c,因爲proc.c是存在的,因此它可以生成proc.i,然後再往上推,最後就可以生成proc這個程序了。
上面這個就是整個程序的依賴關係,而依賴方法就是我們所使用的命令啦,下面是proc.c的Makefile的編寫:
先是依賴關係,然後是依賴方法,寫依賴關係時目標文件在前,依賴文件在後
還有一點需要提醒的是在寫依賴方法時,前面要加Tab鍵
在Makefilr中有一個不成文的規定:
每一個Makefile中都要有清空目標文件的能力
畢竟自己寫的東西要自己負責嘛,如果麼有的話,你的程序改完後還是要將之前的程序刪掉,這樣不好管理,有時還會坑到別人,所以要有這個“修養”!
清理目標文件的方法就是先用.PHONY創建一個“僞目標”,我上面的clean就是一個僞目標,再給僞目標定義方法,也就是刪除目標文件的命令。
還有規定claer必須放在文件最後!
接下來就是執行我們的make命令來看看效果了,這裏先說下make是怎麼工作的哈:
當make執行起來後,會找當前目錄下的Makefile文件,然後找第一個目標文件,並把它作爲最終文件,並通過你給的依賴方法生成最終文件,然後停止。
由於我們的clean和最終文件沒有半毛錢關係,所以想要執行clean,就要用make命令進行顯示調用才起作用。
我們可以通過上面的例子來看看make的效果:
首先先執行make
這時候出現proc,說明文件成功被編譯鏈接。
然後我們再用make顯示執行下clean:
proc程序也就消失了
這就是make和Makefile的基本用法,還是很方便的,希望大家看完之後對你們有所幫助,在說拜拜之前,補充下如果想在終端顯示依賴方法的話,就把前面的@去掉哦!
好了,再了個見吶!