通用的makefile寫法

2022-08-05 02:54:19 字數 1497 閱讀 4572

1 定義可執行檔案的名稱

target =mypro

2 指定此編譯工程所要使用的標頭檔案所在的目錄

inc = -i. -iheader1 -iheader2

3 指定cpp檔案所在的目錄

vpath = .:src1:src2

4 指定所有的cpp檔案

src_path = $(foreachdir,$(subst :, ,$(vpath)),$(wildcard $(dir)/,*.cpp))

解釋:foreach,subst,wildcard為makefile的內建函式,其中wildcard函式為字串連線函式,把函式中的兩個引數連線成乙個。subst是字串替換函式,在此句中意思是把vpath變數中的冒號替換成空格。foreach函式,就是把subst函式的返回值,以空格為分隔符,迴圈取值賦給dir,然後接受wildcard的處理。

這句的總體意思是:從vpath中獲取每個目錄,並分別找出此目錄下所有的cpp檔案,賦給src_path變數。

5 定義中間object檔案存放的目錄。

obj_dir = ./obj

6 所有的object檔案要按照和源**對應的目錄存放,定義object檔案的目錄

obj_path = $(addprefix $(obj_dir)/, $(subst :,,$(vpath) ) )

解釋:addprefix函式是加字首的函式,詞句中是給vpath中所有已經定義的目錄加上./obj/的字首。

7 定義連線成目標檔案所需要的所有的object檔案的名稱

objs = $(addprefix $(obj_dir),$(subst.cpp,.o,$(src_path)))

8 建立乙個object檔案的目錄

make_object_dir := $(shell mkdir -p $(obj_dir)$(obj_path))

9 定義實用的編譯器

cxx = g++

cxxflags = -g

10 定義目標檔案的生成規則

$(target) : $(objs)

$(cxx) -o $@ $(objs) $(inc)$(cxxflags)

11 定義object檔案的生成方式:

$(obj_dir)/%.o : %.cpp%.cpp.d

$(cxx) -o $@ -c$< $(inc) $(cxxflags)

12 定義.cpp.d檔案的生成方式

deps = $(objs:.o=.cpp.d)

$(deps) : $(obj_dir)/%.cpp.d : %.cpp

$(cxx) $< -mm$(inc) > $(obj_dir)/$<.d

13 定義清理函式

clean:

@rm -rf./obj

@rm -rf$(target)

至此,乙個通用的makefile完成了,如果增加源**目錄和頭檔案目錄,只需要在inc變數和vpath變數處加上此目錄即可。中間object檔案和檔案的依賴關係自動生成。

Makefile的一種通用寫法

管理linux環境下的c c 大型專案,如果有乙個智慧型的build system會起到事半功倍的效果,本文描述linux環境下大型工程專案子目錄makefile的一種通用寫法,使用該方法,當該子目錄內的檔案有增刪時無需對makefile進行改動,可以說相當的智慧型。下面先貼 為減小篇幅,一些非關鍵...

makefile的寫法 一

linux中使用g 的方法 第一步預處理 g e test.cpp o test.i o 表示輸出的專案 該部處理將巨集,typedef等處理替換 結果是 i 檔案 1.預處理 pre processing gcc e test.c o test.i i檔案 第二步編譯 g s test.i o t...

makefile的簡單寫法

makefile 使用方法 vi 乙個makefile檔案 cc g 指的是用什麼編譯器 rm rm rf 定義乙個刪除的指令 變數 cflags c wall i.d debug 編譯標誌 冒號左邊是目標,右邊是依賴 client main.o client.o logreader.o conso...