Linux程式設計之Makefile入門

2021-10-06 15:29:49 字數 4282 閱讀 7545

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 父程序的返回值,說明當前程式在父程序執行,返回值為生成子...