多個檔案目錄下Makefile的寫法

2022-06-10 21:39:14 字數 2654 閱讀 8888

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 ...