1、前言
目前從事於linux下程式開發,涉及到多個檔案,多個目錄,這時候編譯檔案的任務量比較大,需要寫makefile。關於makefile的詳細內容可以參考網上流傳非常廣泛的《跟我一起寫makefile》作者是個大牛,非常佩服。
2、簡單測試
測試程式在同乙個檔案中,共有func.h、func.c、main.c三個檔案,makefile寫法如下所示:
1 cc = gcc執行過程如下圖所示:2 cflags = -g -wall
3 4 main:main.o func.o
5 $(cc) main.o func.o -o main
6 main.o:main.c
7 $(cc) $(cflags) -c main.c -o main.o
8 func.o:func.c
9 $(cc) $(cflags) -c func.c -o func.o
10 clean:
11 rm -rf *.o
3、通用模板
實際當中程式檔案比較大,這時候對檔案進行分類,分為標頭檔案、原始檔、目標檔案、可執行檔案。也就是說通常將檔案按照檔案型別放在不同的目錄當中,這個時候的makefile需要統一管理這些檔案,將生產的目標檔案放在目標目錄下,可執行檔案放到可執行目錄下。測試程式如下圖所示:
完整的makefile如下所示:
1 dir_inc = ./include解釋如下:2 dir_src = ./src
3 dir_obj = ./obj
4 dir_bin = ./bin
5 6 src = $(wildcard $/*.c)
7 obj = $(patsubst %.c,$/%.o,$(notdir $))
8 9 target = main
10 11 bin_target = $/$
12 13 cc = gcc
14 cflags = -g -wall -i$
15 16 $:$
17 $(cc) $(obj) -o $@
18
19 $/%.o:$/%.c
20 $(cc) $(cflags) -c $< -o $@
21 .phony:clean
22 clean:
23 find $ -name *.o -exec rm -rf {}
(1)makefile中的 符號 $@, $^, $< 的意思:
$@ 表示目標檔案
$^ 表示所有的依賴檔案
$
$? 表示比目標還要新的依賴檔案列表
(2)wildcard、notdir、patsubst的意思:
wildcard : 擴充套件萬用字元
notdir : 去除路徑
patsubst :替換萬用字元
例如下圖例子所示:
輸出結果如下所示:
等於指定編譯當前目錄下所有.c檔案,如果還有子目錄,比如子目錄為inc,則再增加乙個wildcard函式,象這樣:
src = $(wildcard *.c) $(wildcard inc/*.c)
(3)gcc -i -l -l的區別:
gcc -o hello hello.c -i /home/hello/include -l /home/hello/lib -lworld
上面這句表示在編譯hello.c時-i /home/hello/include表示將/home/hello/include目錄作為第乙個尋找標頭檔案的目錄,
尋找的順序是:/home/hello/include-->/usr/include-->/usr/local/include
-l /home/hello/lib表示將/home/hello/lib目錄作為第乙個尋找庫檔案的目錄,
尋找的順序是:/home/hello/lib-->/lib-->/usr/lib-->/usr/local/lib
-lworld表示在上面的lib的路徑中尋找libworld.so動態庫檔案(如果gcc編譯選項中加入了「-static」表示尋找libworld.a靜態庫檔案)
makefile 編譯當前目錄下的檔案
makefile 2018 10 23 build all c file 目標檔案 所有的依賴檔案 第乙個依賴檔案。版本號 version v1.0.0 編譯器版本 cc arm none linux gnueabi gcc 指定目錄下的原始檔,srcs wildcard c srcs wildca...
單目錄下多檔案 makefile編寫
makefile很久就接觸過了,但是一直沒怎麼深入的去學習和總結 在專案中我也只是看看makefile或者修改部分語句,全部自己動手寫的話還真沒有 知識在於沉澱,這句說的非常好,所以現在把自己理解的東西,記錄下來,以便後面查閱 這篇blog要分享的是在單目錄下多檔案的makefile編寫,首先說明當...
多目錄下多檔案 makefile編寫
前面已經分享了單目錄項下多檔案的makefile的編寫,現在來看看多目錄下多檔案makefile的編寫 在做專案時,一般檔案都會分幾個目錄來存放 基本的是 include bin src obj lib tools 這幾個檔案 我先說下我的檔案存放目錄,用ls r可以檢視到所有檔案 include ...