Makefile是什麼?
makefile的作用:
1、工程文件組織,編譯成複雜的程序
2、安裝及卸載我們的程序
Makefile使用示例
在/home/username/makefile目錄下有如下三個文件:
main.c
func1.c
func2.c
下面我們開始編譯上面的文件:
寫好的Makefile文件如下:
運行make
Makefile的編寫規則
Makefile由若干條上面的規則構成,每個規則如下:
taget目標:prequisites(依賴)
command(命令)
注意:第二行必須有一個Tab縮進
例如上面兩行表示要生成目標文件hello,在生成hello的同時需要依賴main.o func1.o func2.o這三個文件,並且執行gcc main.o func1.o func2.o -o hello命令來生成。
我們來修改一下上面的Makefile
發現不僅生成了hello而且多了幾個func1.c func1.o func2.c func2.o main.c main.o文件,下面我們修改一下Makefile文件,添加一個僞目標
clean就是一個僞目標,不會生成新的文件,下面我們來執行一下make clean來看一下效果
執行make clean後func1.o func2.o main.o全部刪除了(可以想到卸載程序的原理),下面我們就來添加一個install和uninstall僞目標
在我們執行make install的時候會將我們用到的執行文件和庫文件拷貝到指定目錄,在執行uninstall的時候會刪除安裝時的拷貝文件。
下面我們來使用變量MObj代替main.o func1.o func2.o
如果這樣寫MObj := main.o func1.o func2.o 表示不遞歸變量。也可以使用系統的預定義變量,常見的預定義變量如下:
AR_____庫文件維護程序的名稱,默認值爲ar
AS_____彙編程序的名稱,默認值爲as
CC_____C編譯器的名稱,默認值爲cc
CXX____C++編譯器的名稱,默認值爲g++
ARFLAGS_____庫文件維護程序選項,無默認值
ASFLAGS_____彙編程序選項,無默認值
CFLAGS______C編譯器選項,無默認值
CXXFLAGS____C++編譯器選項,無默認值
下面我們使用預定義變量來改寫一下我們上面的Makefile文件
這樣做的好處就是在我們換編譯器的時候非常方便。
下面我們來看看makefile中的自動變量及環境變量:
$*_______不包含擴展名的目標文件名稱
$<_______第一個依賴文件名稱
$?_______所有時間戳比目標文件晚的依賴文件
$@______目標文件完整名稱
$^_______所有不重複的依賴文件
這個時候我們應該清楚了剛開始寫的那個Makefile文件的內容了
上面還對僞目標進行了聲明(.PHONY)這樣做的目的是爲了避免和其他文件同名衝突。