makefile 一看就懂了

前言:沒接觸Linux下編譯以前,以爲很神祕,特別是makefile,一個簡單的make命令就能編譯一個大型項目生成一個可執行文件,接下來跟你們分享下學習的makefile的知識。shell

目錄:函數

1.makefile簡介工具

2.makefile規則學習

3.makefile隱晦規則ui

4.makefile僞目標文檔

5.makefile變量get

6.makefile條件控制語句it

7.makefile文件引用編譯

8.makefile函數編譯原理

9.makefile註釋,換行,-f

10.makefile動手實踐

 

1.makefile簡介

首先,咱們一般使用的make都是gnu make,也就是一種解析makefile的make工具,關於gnu和Linux還有一段鮮爲人知的故事,你們能夠本身查下。makefile就是一個文檔,make工具經過解析這個文檔,把一個個.c .cpp文件經過gcc/g++命令編譯成.o(臨時文件 Object file),再經過gcc/g++命令編譯成一個二進制的可執行文件,也能夠將.o文件連接成一個.a(靜態連接庫,Windows下爲.lib)。

2.makefile規則

makefile接觸最多的一個詞就是目標,它能夠是一個可執行文件,.o,僞目標。makefile編譯就是把最終生成的可執行文件這個目標,依賴其餘的目標,一層層依賴,最終依賴到.c,.cpp文件。另外,make編譯的時候當發現目標所依賴的目標發生變化的時候,纔會從新編譯,節省了編譯時間。makefile目標依賴以下,此處很關鍵:

target : prerequisites

    command

    ...

**提示:cmmand前面是一個tab 

示例:

main : main.o

    cc -o edit main.o

main.o : main.c main.h

    cc -c main.c

3.makefile隱晦規則

#原文件

main : main.o

    cc -o edit main.o

main.o : main.c main.h

    cc -c main.c

#變一下

main : main.o

    cc -o edit main.o

main.o : main.c main.h

#再變一下

main : main.o

    cc -o edit main.o

main.o : main.h

#隱晦規則:編譯工具gcc會自動搜索main.o同目錄的同名.c文件,即main.c,即自動推導。

固然還有不少其餘的隱晦規則,就不一一列舉。

4.makefile僞目標

常見僞目標all,clean..這些僞目標不會生成文件,主要是爲了執行一些命令。

.PHONY : clean

clean :

    rm -f *.o

** .PHONY是爲了不一種情形,當前目錄下已存在名爲clean的文件,在執行clean這個目標的時候,發現已存在clean文件,並clean什麼也沒有,make工具會認爲此目標所依賴的目標沒有發生更新,就不會從新編譯這個目標,也就不會執行下面的rm命令。

5.makefile變量

makefile中的變量沒有類型。一般用來定義一個目錄或一些目標。

b = main.o head.o

a = $(b)

$(a)是對變量a的調用。

a := $(b)

:=是另外一種用法,區別是:=後面只能調用前面已經定義過的變量。避免產生循環調用。

6.makefile控制語句

if .../ifeq...

    ...

else

    ...

endif

 

foreach

...

7.makefile文件引用

#文件引用前面沒有"#"

include "build.mk"

8.makefile函數

咱們可使用使用make提供的函數,也能夠本身定義函數,也能夠叫命令包。

define fun 

command

endef

調用函數:$(fun ...)

9.makefile註釋,換行,-f

#此處註釋,同shell註釋#開頭

    / 此處換行,也能夠做爲多行註釋,因此此處也是註釋,哈哈哈~

make命令執行默認會去執行當前目錄下的makefile或者Makefile文件,或者能夠用 -f、 --file 指定執行的makefile文件。make命令後面能夠跟想要執行的目標,否則默認執行makefile開頭的第一個目標。

make -f build.mk

10.makefile動手實踐

說的再多不如動手實踐,能力的得到%70來自實踐。

趕忙動手寫起來吧!

 

最後,makefile後面進階,則須要多寫makefile,想寫出簡潔可維護的makefile,仍是挺難的,也能夠深刻了解下make工具的執行原理,以及gcc/g++的編譯原理。推薦學習下大神陳皓的《跟我一塊兒寫 Makefile》。

相關文章
相關標籤/搜索