GNU的make命令、makefile編寫
makefile簡介
-
makefile可實現工程的自動化編譯,只需一個make命令即可一鍵完成。makefile定義了一些規則,指定哪些檔案需要先編譯、後編譯、重新編譯等。
-
一般的C或者C++程式,都需要先編譯成中間檔案,windows下為.obj檔案,UNIX下為.o檔案,這個過程稱為編譯(compile)。
-
每個原檔案都應該對應一箇中間檔案(.obj檔案或者.o檔案),把大量的中間檔案合成執行檔案的過程,稱為連結(Link);連結時,主要是連結函式和變數,即可以使用.obj檔案或者.o檔案連結應用程式。連結器只關係函式的中間檔案,不關心原始檔的位置,為了避免大量的中間檔案的複雜管理,需給中間檔案打包,windows下稱為庫檔案(Library File),即.lib檔案,UNIX下為Archive File,即 .a檔案。
makefile規則
流程
目標 : 需要的條件(注意 : 兩邊的空格)
命令(以Tab鍵開頭)
解釋一下:
目標
可以是一個或者多個,可以是ObjectFile檔案、執行檔案、甚至標籤條件
指的是 依賴的檔案或者目標命令
指的是 生成目標需要執行的指令碼
總結:即一條makefile規則定義了編譯的依賴關係,目標檔案依賴於條件,生成規則用命令
舉個例子
objects = main.o kbd.o command.o display.o / insert.o search.o files.o utils.o edit : $(objects) cc -o edit $(objects) main.o : main.c defs.h cc -c main.c kbd.o : kbd.c defs.h command.h cc -c kbd.c command.o : command.c defs.h command.h cc -c command.c display.o : display.c defs.h buffer.h cc -c display.c insert.o : insert.c defs.h buffer.h cc -c insert.c search.o : search.c defs.h buffer.h cc -c search.c files.o : files.c defs.h buffer.h command.h cc -c files.c utils.o : utils.c defs.h cc -c utils.c clean : rm edit $(objects)
make命令
- 首先在當前目錄下尋找"makefile"或者"Makefile"檔案找到,則定位到第一個目標檔案(target),上例中,會找到"edit"檔案,並把此檔案作為最終目標檔案
- 若eidt檔案不存在,或者eidt後依賴的.o檔案的修改時間比edit檔案新,則執行後面定義的命令生成edit檔案
- 若edit後依賴的.o檔案也不存在,make會在當前檔案中尋找.o檔案的依賴性,若找到,則根據那個規則生成.o檔案.c和.h檔案存在,make生成.o檔案,最後執行edit
自動推導
GNU的make命令支援自動推導,只要make看到一個.o檔案,就會自動把.c檔案加到依賴關係中,則上述例子可簡化為以下形式
objects = main.o kbd.o command.o display.o /
insert.o search.o files.o utils.o
edit : $(objects)
cc -o edit $(objects)
main.o : defs.h
kbd.o : defs.h command.h
command.o : defs.h command.h
display.o : defs.h buffer.h
insert.o : defs.h buffer.h
search.o : defs.h buffer.h
files.o : defs.h buffer.h command.h
utils.o : defs.h
clean :
rm edit $(objects)
檔案功能
make支援多檔案共簡規則,上述例子可進一步簡化為如下形式(但不推薦,因為較難維護)
objects = main.o kbd.o command.o display.o /
insert.o search.o files.o utils.o
edit : $(objects)
cc -o edit $(objects)
$(objects) : defs.h
kbd.o command.o files.o : command.h
display.o insert.o search.o files.o : buffer.h
clean :
rm edit $(objects)
清空目標檔案規則
每一個makefile檔案都應該清楚的寫一個清空目標的(.o和執行檔案)規則,有利於重編譯和檔案的清結性。
.PHONY
表示clean是一個"偽目標",rm前的減號表示,某些檔案出問題但是不要管,繼續往下走。
clean預設放在檔案尾,不然會被當作預設目標。
`一般的風格為:`
clean:
rm edit $(objects)
`較為穩健的方法:`
.PHONY : clean
clean :
-rm edit $(objects)
make編譯安裝
流程
-
首先下載
.tar.gz
或者.tar.bz2
軟體包檔案 -
使用
tar
命令解壓 -
進入到解壓後文件目錄(因為make是搜尋當前檔案位置)
-
使用
./configure -prefix={Your Install Path}
(其他configure引數自行百度) -
make編譯(或者使用make all,過程有時很慢,有時會報錯,可能是依賴包的問題,解決依賴關係即可)
-
make install
安裝(需足夠許可權,部分軟體需要make check 或者 make test 進行測試) -
make clean
清除編譯產生的中間檔案(Objectfile或者.o檔案)
舉個例子
//1.解壓縮
tar -zxf xxxxx-4.0.2.tar.gz
//2.進入目錄
cd xxxxx-4.0.2
//3.配置
./configure --prefix=/usr/local/xxxxx
//4.編譯
make all
//5.安裝
make install && make install-init && make install-commandmode && make install-config
//6.清除中間檔案
make clean
相關連結
- http://blog.csdn.net/haoel/article/details/2887
- http://www.cnblogs.com/xwdreamer/p/3623454.html
- http://www.linuxidc.com/Linux/2011-02/32211.htm