makefile與shell指令碼類似,是一系列命令的集合。用於專案**編譯管理。其定義了一系列的規則來指定檔案是否需要編譯以及編譯順序,甚至進行更複雜的功能操作。
目標:依賴條件
[tab]命令 // 注:命令若另起一行,命令前必須為[tab鍵]
目標:要生成的檔案
依賴條件:
命令:
makefile1:
hello.o:hello.c
[乙個tab鍵]gcc -c hello.c -o hello.o
若想生成目標,檢查規則中的依賴條件是否存在,如不存在,則尋找是否存在規則用來生成該依賴檔案。
檢查規則中的目標是否需要更新,必須先檢查他的所有依賴,依賴中有任何乙個被更新,則目標必須更新。
makefile2:
hello:hello.o
gcc hello.o -o hello
hello.o:hello.c
gcc -c hello.c -o hello.o
當存在多個檔案聯合編譯生成乙個可執行檔案時,可對比出makefile1與makefile2的優劣。
a.out:
111.c 222.c 333.c
gcc 111.c 222.c 333.c -o a.out
a.out:
111.o 222.o 333.o
gcc 111.o 222.o 333.o -o a.out
111.o:
111.c
gcc -c 111.c -o 111.o
222.o:
222.c
gcc -c 222.c -o 222.o
333.o:
333.c
gcc -c 333.c -o 333.o
makefile5 :此時,目標的順序不再受限。
all:a.out
a.out:
111.o 222.o 333.o
gcc 111.o 222.o 333.o -o a.out
111.o:
111.c
gcc -c 111.c -o 111.o
222.o:
222.c
gcc -c 222.c -o 222.o
333.o:
333.c
gcc -c 333.c -o 333.o
src = $(wildcard *
.c)
obj = $(patsubst %
.c,%
.o,$(src)
)all:a.out
a.out:$(obj)
gcc $(obj)
-o a.out
111.o:
111.c
gcc -c 111.c -o 111.o
222.o:
222.c
gcc -c 222.c -o 222.o
333.o:
333.c
gcc -c 333.c -o 333.o
我們生成了多個編譯檔案,makefile存在乙個清除目標檔案的規則,規則如下:
clean:
rm a.out
更為穩健的做法是:.phony表示clean是乙個偽目標;「-」表示出錯依然執行。不成文的規定「clean」規則一般放在檔案最後。
.phony:clean
clean:
-rm -rf a.out
makefile7 :
src = $(wildcard *
.c)
obj = $(patsubst %
.c,%
.o,$(src)
)all:a.out
a.out:$(obj)
gcc $(obj)
-o a.out
111.o:
111.c
gcc -c 111.c -o 111.o
222.o:
222.c
gcc -c 222.c -o 222.o
333.o:
333.c
gcc -c 333.c -o 333.o
.phony:clean
clean:
-rm -rf $(obj) a.out
執行clean的命令為 「make clean」,以防萬一,釀成大禍,建議先執行「make clean -n」,預執行一下,觀察結果正確後,再執行「make clean」。
在makefile7的基礎上,引入自動變數:
makefile8 :
src = $(wildcard *
.c)
obj = $(patsubst %
.c,%
.o,$(src)
)all:a.out
a.out:$(obj)
gcc $^
-o $@
111.o:
111.c
gcc -c $<
-o $@
222.o:
222.c
gcc -c $<
-o $@
333.o:
333.c
gcc -c $<
-o $@
.phony:clean
clean:
-rm -rf $(obj) a.out
%.o:%.c
gcc -c $< -o $@
src = $(wildcard *
.c)
obj = $(patsubst %
.c,%
.o,$(src)
)all:a.out
a.out:$(obj)
gcc $^
-o $@
%.o:%.c
gcc -c $<
-o $@
.phony:clean #強制執行
clean:
-rm -rf $(obj) a.out
靜態模式規則:表示對哪乙個依賴條件套用模式規則
$(obj)%.o:%.c
gcc -c $< -o $@
src = $(wildcard *
.c)
obj = $(patsubst %
.c,%
.o,$(src)
)all:a.out
a.out:$(obj)
gcc $^
-o $@
$(obj)
%.o:%.c
gcc -c $<
-o $@
%.o:%.s
gcc -s $<
-o ...
.phony:clean #強制執行
clean:
-rm -rf $(obj) a.out
偽目標:.phony:clean all #強制執行
src = $(wildcard *
.c)
obj = $(patsubst %
.c,%
.o,$(src)
)c_flags =
-wall -g
all:a.out
a.out:$(obj)
gcc $^
-o $@ $c_flags
$(obj)
%.o:%.c
gcc -c $<
-o $@ $c_flags
%.o:%.s
gcc -s $<
-o ...
.phony:clean #強制執行
clean:
-rm -rf $(obj) a.out
= 與 :=
= 是最基本的賦值回
:= 是覆蓋之前的值
?= 是如果答沒有被賦值過就賦予等號後面的值
+= 是新增等號後面的值
萬能makefile位址 Linux下C語言程式設計基礎 Makefile
假設我們有下面這樣的乙個程式,源 如下 main.c include mytool1.h include mytool2.h int main int argc,char argv mytool1.h ifndef mytool 1 h define mytool 1 h void mytool1 ...
linux程式設計之mprotect
mmap 的第三個引數指定對記憶體區域的保護,由標記讀 寫 執行許可權的 prot read prot write 和 prot exec 按位與操作獲得,或者是限制沒有訪問許可權的 prot none。如果程式嘗試在不允許這些許可權的本地記憶體上操作,它將被 sigsegv 訊號 segmenta...
Linux程式設計之fork
fork 建立乙個子程序 建立失敗返回負值 同時會有不同的錯誤碼 errno eagain 系統程序個數限制 enomem 申請記憶體失敗 enosys 系統平台不支援 建立成功將會返回兩個值 0 子程序的返回值,說明當前程式在子程序執行 0 父程序的返回值,說明當前程式在父程序執行,返回值為生成子...