Makefile

理由:Linux環境下,編碼、測試、自動化編譯都靠本身解決linux

 
add.c
 #include "test.h"

int add(int x, int y){
}
return x+y;
 
 
test.h
#ifndef _TEST_H
#define _TEST_H

int add(int x, int y);
#endif
 
Makefile編寫
test:add.o
     gcc -o test add.o

add.o:add.c test.h
     gcc -c add.c

clean:
     rm -rf test
     rm -rf *.o
 

 
編譯簡單原理:
          先將源文件編譯爲中間代碼文件,在Linux的.o文件,window爲.obj文件,即Object File,這個動做稱爲編譯(compile),而後將中間代碼文件合成執行文件,這個動做叫連接(link)
               編譯:只管語法、函數與變量聲明的正確性;一般須要告訴編譯器頭文件的位置,如「add.o:add.c test.h」,當語法正確時,編譯器就能編譯出中間文件,通常是一一對應的
               連接:主要是連接函數和全局變量;只在中間目標文件中尋找函數,且須要顯示的給定目標文件名,當目標文件較多時,能夠打包便於操做,linux下.a文件(Archive File),windows下.lib文件(庫文件)
          總結:函數未被在h文件中聲明,能夠生產Object File,編譯器給出警告;而連接在全部的Object File中找不到函數的實現,會報連接錯誤碼(Linker Error),Link 2001
 
 
常規寫法
target:目標文件 依賴的中間文件
 
command
 
clean
 
編譯規則
          
一、make會在當前目錄下找名字叫「Makefile」或「makefile」的文件。
二、若是找到,它會找文件中的第一個目標文件(target),在上面的例子中,他會找到「test」這個文件,並把這個文件做爲最終的目標文件。
三、若是test文件不存在,或是test所依賴的後面的 .o 文件的文件修改時間要比test這個文件新,那麼,他就會執行後面所定義的命令來生成edit這個文件。
四、若是test所依賴的.o文件也不存在,那麼make會在當前文件中找目標爲.o文件的依賴性,若是找到則再根據那一個規則生成.o文件。(這有點像一個堆棧的過程)
五、固然,你的C文件和H文件是存在的啦,因而make會生成 .o 文件,而後再用 .o 文件生成make的終極任務,也就是執行文件test了。
 
變量的聲明:
          若是屢次使用多個一樣的中間目標文件,則能夠聲明var_name=1.o 2.o 3.o;而後經過$(var_name)來引用
 
僞目標:
          .PHONY : clean
          同時在rm前加'-',讓其跳過錯誤
 
高級的gun make有自動推倒功能,能根據給定的c和h文件,自動生成o文件
     即只寫add.o:add.c test.h,不須要gcc -o add.o
 
make clean來清除中間中間文件,便於重編譯,也很利於保持文件的清潔
 
更多內容參考http://wiki.ubuntu.org.cn/%E8%B7%9F%E6%88%91%E4%B8%80%E8%B5%B7%E5%86%99Makefile:MakeFile%E4%BB%8B%E7%BB%8D
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息