這裡簡單說一下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 依...