GNU.Make
Make的詳細用法在以下博客中有介紹,並附詳細的例子。
https://www.cnblogs.com/wang_yb/p/3990952.html
Makefile指定輸出路徑
直接上例子,文件組織如下:
- src/
- main.cpp
- party.cpp
- party.h
- speak.h
- sing.cpp
- say.cpp
- obj/
Makefile語法:
D_SRC = src
D_OBJ = obj
D_INC = -I./include
D_LIB = lib
TARGET = hello
# list all the .cpp file in src directory
SOURCES = $(wildcard $(D_SRC)/*.cpp)
# list all the .cpp file in src directorys
#SOURCES = $(foreach dir, $(D_SRC), $(wildcard $(dir)/*.cpp))
OBJECTS = $(addprefix $(D_OBJ)/,$(patsubst %.cpp,%.o,$(notdir $(SOURCES))))
$(TARGET): #$(OBJECTS)
# g++ -o $@ $^ $(LIB)
@echo $(SOURCES)
$(D_OBJ)/%.o: $(D_SRC)/%.cpp
g++ -c -Wall $(INC) $< -o $@
clean:
-rm $(D_OBJ)/*
-rm $(TARGET)
獲取src中所有的cpp文件
當D_SRC變量爲單個路徑時可以使用第一種方法
SOURCES = $(wildcard $(D_SRC)/*.cpp)
wildcard-擴展通配符
wildcard爲擴展通配符,即將、$(D_SRC)/*.cpp完整展開爲:src/main.cpp src/party.cpp src/say.cpp src/sing.cpp(以括號間隔)。用法爲:
$(wildcard \$(pattern))
當D_SRC爲多個路徑時,即使用第二種方法。比如D_SRC = src src/a,則SOURECS會列出兩個路徑下的所有cpp文件
SOURCES = $(foreach dir, $(D_SRC), $(wildcard $(dir)/*.cpp))
foreach-遍歷
語法
$(foreach <var>,<list>,<text>)
示例:
# Makefile 內容
targets := a b c d
objects := $(foreach i,$(targets),$(i).o)
all:
@echo $(targets)
@echo $(objects)
# bash 中執行 make
$ make
a b c d
a.o b.o c.o d.o
將.cpp轉化爲.o結尾
OBJECTS = $(addprefix $(D_OBJ)/,$(patsubst %.cpp,%.o,$(notdir $(SOURCES))))
notdir-取文件名函數
語法
$(notdir <names...>)
功能: 從文件名序列names 中取出非目錄部分
返回: 文件名序列names中的非目錄部分
示例:
# Makefile 內容
all:
@echo $(notdir /home/a.c ./bb.c ../c.c d.c)
# bash 中執行 make
$ make
a.c bb.c c.c d.c
patsubst-模式字符串替換函數:
語法:
$(patsubst <pattern>,<replacement>,<text>)
功能: 查找text中的單詞(單詞以”空格”, “tab”, “換行”來分割) 是否符合 pattern, 符合的話, 用 replacement替代.
返回: 替換過的字符串
示例:
# Makefile 內容
all:
@echo $(patsubst %.c, %.o, programA.c programB.c)
# bash 中執行 make
$ make
programA.o programB.o
addprefix-加前綴函數:
語法:
$(addprefix <prefix>,<names...>)
功能: 把前綴 加到 中的每個單詞前面
返回: 加過前綴的文件名序列
示例:
# Makefile 內容
all:
@echo $(addprefix test_,/home/a.c b.c ./d.c)
# bash 中執行 make
$ make
test_/home/a.c test_b.c test_./d.c
本例參考https://blog.csdn.net/javababy3/article/details/77918228