多目錄工程的 makefile 範例

2021-06-16 11:41:56 字數 2567 閱讀 4144

最近一直在研究makefile ,看了網上比較流行的文章《跟我一起寫 makefile》,還有一篇是《gnu makefile中文手冊》,兩者的關係是前者是後者的子集,連《跟我一起寫 makefile》作者都說了是參考《gnu makefile中文手冊》來寫的,感嘆linux下的開發真的是奧妙無窮,每一項技術都似一頓饕餮大餐,吃起來爽,消化掉難。

make 的技術目前還只是掌握了點皮毛而已,書上的範例只是針對了同目錄下的多檔案的編譯講解,可是我想通常乙個簡單的專案也不止乙個目錄,於是學著寫乙個多目錄下的的makefile,搞了一天,居然不知從何下手,暈!baidu 一下,沒幾篇文章介紹的,而且僅有的幾篇也寫得比較模糊,方法也千差萬別。。。

鬱悶中,突然想起自己手頭的專案的gui模組的makefile 不是咱老大寫的麼,醍醐灌頂...,為什麼最需要的總是最後才想起?只怪自己開竅太慢!廢話少說,趕緊的!!

說實話,目前所做的專案技術含量低,嵌入式開發中的gui模組,不過這個gui模組的規模還不小,裡面還細分了好幾塊,正好滿足我的要求,開啟老大的傑作仔細端倪,跟蹤列印資訊,一步一步推敲(笨人的高招),還真有點開竅了,老大就是老大阿。

下面就是我自己參考老大的技術寫的針對多目錄的makefile

我們要編譯的工程是乙個主目錄proj, 它下面有4個子目錄: /main /ui /math /obj

其中main中包含檔案 main.c

ui 中包含了檔案 ui.h ui.c

math 中包含了檔案 math.h math.c

obj 用於存放最終生成的目標

他們的關係是

main.c include "ui.h" "math.h"

ui.c include "ui.h" "math.h"

math.c include "math.h"

要求是在proj 目中的obj 目錄中生成 out(主程式) ui.o main.o 以及乙個動態庫檔案 libmath.so

第一種做法是在每乙個子目錄中都新增乙個makefile檔案, 當然主目錄proj中的makefile必不可少,同時還在主目錄中

建立乙個env.mk檔案,其作用就是包含了其他makefile都用到的模式規則

--------------------- env.mk----------------------------

cc := gcc

#頭檔案目錄

include_dir := \ 

-i$(makeroot)/ui \

-i$(makeroot)/main \

-i$(makeroot)/math

cflags := $(include_dir)

#對所有的.o檔案以.c檔案建立它

%.o : %.c

$ $ -c $< -o $(makeroot)/obj/$@

-------------------proj/makefile -----------------------

export makeroot := $(shell pwd)

target_dirs := main \

ui \

math

include ./env.mk

define build_obj

for subdir in $(target_dirs); do \ #對所每乙個子目錄如果其存在

if ! [ -d $$subdir ]; then \

echo "the $$subdir is not exist !"; \

exit 11; \

fi; \

echo "building $$subdir ..."; \

make -c $$subdir ; \ #執行子目錄的makefile

if [ $$? -ne 0 ]; then \

echo "building $$subdir is failed !"; \

exit 12; \

fi; \

done

endef

all :

@$(call build_obj) #呼叫過程

gcc -fpic -o out ./obj/*.o ./obj/*.so #生成最終目標

clean :

-rm ./obj/*.o ./out ./obj/*.so

------------- ui/makefile main/makefile ----------------

include $(makeroot)/env.mk #包括標頭檔案,執行模式規則

srcs := $(wildcard *.c)

objs := $(patsubst %.c,%.o,$(srcs)) #生成所有.c檔案對應的.o檔案

.phony : all

all : $(objs)

------------------ math/makefile -----------------------

.phony : all

all :

gcc -shared -o ../obj/libmath.so math.c math.h #生成動態庫檔案

現在只要到proj主目錄中,執行make all 命令就萬事ok啦!!

多目錄下多檔案 makefile編寫

前面已經分享了單目錄項下多檔案的makefile的編寫,現在來看看多目錄下多檔案makefile的編寫 在做專案時,一般檔案都會分幾個目錄來存放 基本的是 include bin src obj lib tools 這幾個檔案 我先說下我的檔案存放目錄,用ls r可以檢視到所有檔案 include ...

makefile實現對多檔案 多目錄的操作步驟

makefile實現對多檔案 多目錄的操作步驟 僅作個人複習筆記,以備後查。首先 建立乙個目錄 test 並建立子目錄 sub test 目錄新建檔案 a.c b.c sub子目錄新建檔案 sa.c sb.c 內容都比較 簡單,因為簡單,所以不列出來了。詳細見下面操作步驟 root ubuntu h...

單目錄下多檔案 makefile編寫

makefile很久就接觸過了,但是一直沒怎麼深入的去學習和總結 在專案中我也只是看看makefile或者修改部分語句,全部自己動手寫的話還真沒有 知識在於沉澱,這句說的非常好,所以現在把自己理解的東西,記錄下來,以便後面查閱 這篇blog要分享的是在單目錄下多檔案的makefile編寫,首先說明當...