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
相關鏈接
- //blog.csdn.net/haoel/article/details/2887
- //www.cnblogs.com/xwdreamer/p/3623454.html
- //www.linuxidc.com/Linux/2011-02/32211.htm

