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