開發記錄 Makefile快速入門

2021-08-18 05:14:50 字數 3062 閱讀 4250

這裡簡單說一下makefile的寫法,主要是個人的喜歡寫法,複雜的語法部門沒有加入,只是一些簡單的入門,同時也是我經常使用的。

在makefile中也是有一些我們常用的函式的,簡單的比如:

主要功能就是增加字首,用法如下:

$(addprefix prefix,names...)
例子:

$(addprefix src/,foo.c bar.c)
得到的列表為src/foo.c src/bar.c

增加字尾,用法與addsuffix類似,用法如下:

$(addsuffix prefix,names...)
例子:

$(addsuffix c,foo bar)
得到的列表為foo.c bar.c

獲取當前目錄下符合條件的檔案,也是使用乙個簡單的例子:

src_files = $(wildcard *.c *.cpp)
此時會將資料夾內的c和cpp檔案賦值給src_files,後續可以使用這個變數進行處理。wildcard的語法是:

$(wildcard pattern...)
在makefile中,他被展開為已經存在的,使用空格分開的並且匹配此模式的檔案列表。通常會使用萬用字元進行匹配,如果匹配不到任何檔案,則會返回空。

這個函式主要用匹配替換,還是先出乙個例子:

objs = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(src_files)))
上面這個離職中,objs的值會是$(src_files)中所有檔案的名字,但是以.o最為副檔名。patsubst的語法規則如下:

$(patsubst %.c,%.o,$(file_list))
patsubst有三個引數,分別是:

1. 第乙個引數是需要匹配的樣式

2. 第二個引數是替換後的樣式

3. 第三個引數是以空格隔開的需要處理的列表

一般都是用於生成.o的列表,然後通過依賴關係依次展開。

變數變數含義

$@擴充套件單錢的目標檔名

$<擴充套件成依賴的列表中的第乙個依賴檔名

$^擴充套件成整個依賴的列表(去重)

$?表示比目標還要新的檔案列表

$%僅當目標是函式庫檔案中,表示規則中的目標成員名。

$+$^類似,是所有依賴目標的集合,但是並不去重

$*這個變數表示目標模式中%以及之前的部分。

下面三個並不常用,也比較難理解,所以我加了乙個例子,這裡把%.o:%.c展開寫,並為了區分$<$^稍作修改:

cpp_func.o : cpp_func_1.cpp cpp_func_2.cpp
此時,

-$@| cpp_func.o

-$<| cpp_func_1.cpp

-$^| cpp_func_1.cpp cpp_func_2.cpp

-$?| cpp_func_1.cpp cpp_func_2.cpp

-$%| 這種情況下應該是空的

-$*| cpp_func(但是上面的沒有使用%.o這種形式去推到,上面那麼寫並不一定會是這樣的)

這個比較簡單,用乙個比較簡單的例子就可以很明確了:

src_file = $(

in)

在執行make的時候,在shell裡面如下輸入即可:

make all

in=hello_world.cpp

xx = g++

cc = g++

cflags = -g

cflagsxx = -g --std=c++11

inc = -i./

lib = -l./

target = test_hello

src_files = $(wildcard *.c *.cpp)

objs = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(src_files)))

%.o:%.c

@echo

"excu $(cc) -c $< -o $@ $(cflags) $(inc)"

$(cc) -c $< -o $@

$(cflags) $(inc)

%.o:%.cpp

@echo

"excu $(xx) -c $< -o $(cflagsxx) $(inc)"

$(xx) -c $< -o $@

$(cflagsxx) $(inc)

$(target):$(objs)

@echo

"make $@ by $^"

$(xx) $^ -o $@

$(cflags) $(inc) $(lib)

$(rm) *.o $(objs)

all:$(target)

@echo

"make all"

clean:

$(rm) $(target) $(objs)

test:$(target)

@echo

"make test"

./$(target)

快速入門makefile

在linux系統中我們通常使用gcc等命令來實現乙個專案的流程,而makefile類似於乙個shell指令碼,通過一系列規則來幫助我們簡化專案的編譯 鏈結等操作。可以實現近乎windows上vc 等編譯器的功能。我們可以像在終端中輸入命令一樣,將命令寫在makefile中。依靠簡單的依賴原則,mak...

makefile學習記錄

一.環境變數makefiles和include的區別 1.環境變數makefiles所制定的makefile檔案中的 目標 不會被作為make執行的終極 目標 2.環境變數所定義的檔案列表是否存在不會導致make錯誤,也不退出 3.在執行make時,首先讀取的是環境變數makefiles所指定的檔案...

makefile 語法記錄

是最基本的賦值 是覆蓋之前的值 是如果沒有被賦值過就賦予等號後面的值 是新增等號後面的值 c.o 這句話的意思就是 o c 也就是說,所有的.o檔案,依賴於對應的.c檔案.c.o 字尾規則。它告訴make 後面的命令 使用從.c檔案生成.o 目標檔案除去字尾的部分,如果目標是xx.o,那麼 xx 依...