上面的”build debug”和”build release”之类的字符串根本不会打印出来。上面的正确写法应该是将shell脚本放在target,示例如下:
all:
if [ "$(BUILD)" = "debug" ]; then echo "build debug"; else echo "build release"; fi
echo "done"
此两者均为通配符,但更准确的讲,%为Makefile规则通配符,一般用于规则描述,*为扩展通配符,用于扩展。如
%.o:%c
$(CC) $< -o $@
表示所有的目标文件及其所有依赖文件,然后编译所有目标文件的第一个依赖文件,并生成目标文件。再如:
$(filter %.c ,SOURCES)
此处SOURCES表示包含.c .cc .cpp等多类型源文件,该过滤器函数将c文件过滤出来,而%.c即为此过滤器规则。
通配符*则不具备上述功能。尤其是在Makefile中,当变量定义或者函数调用时,通配符%的展开功能就失效了。此时需要借助wildcard函数。通配符*常用于wildcard函数中,二者应用范围不同。
PHONY的用法:
.PHONY Target1 Target2
PHONY的作用:
指明Target是伪目标,并不会真正生成Target目标文件。伪Target是用来显示请求执行的命令名称。
为什么使用PHONY来指明命令名称:
(1)避免和同名文件冲突。其实是可以不用.PHONY来指明命令名称,因为命令并不会被产生,也就是不存在,所以make target时命令始终会被执行。但是当存在与命令名称同名的目标文件时,一定要使用PHONY来描述命令名,因为命令名没有依赖文件,如果同名的文件始终是最新文件,那么显示make命令名时,该命令永远不会被执行。为避免这个问题,可使用”.PHONY”指明该命令名称。如:
.PHONY : clean
clean:
rm -f *.out *.o
这样执行make clean会无视clean文件存在与否,或者是否是最新的。直接执行clean这个伪目标依赖的命令。
(2)使用.PHONY指定伪目标可以改善性能。因为PHONY目标并非是由其它文件生成的实际文件,没有依赖项,make 会跳过依赖项的搜索和依赖项的更新检查。这就是声明phony 目标会改善性能的原因。
假设源文件均为.cpp文件,那么简洁的,通用的makefile模板可以书写为如下格式:
DIR_SRC0 = ./src0
DIR_SRC1 = ./src1
DIR_O = ./obj
DIR_BIN = ./bin
#添加第三方头文件目录,如果你用到了第三方的源码,静态或者动态链接库的话
INCDIR=-I/usr/local/json/include -I/usr/local/libcurl/inc
#添加静态链接库目录,如果你用到了第三方的静态链接库的话
LIBDIR=-L/usr/local/json -L/usr/local/libcurl
#通过扩展通配符函数wildcard在多个原文件目录寻找源文件
SRC = $(wildcard ${DIR_SRC0}/*.cpp) $(wildcard ${DIR_SRC1}/*.cpp)
O = $(patsubst %.cpp,${DIR_O}/%.o,$(notdir ${SRC}))
TARGET = main.out
BIN_TARGET = ${DIR_BIN}/${TARGET}
CC = g++
CFLAGS = -g -Wall ${INCDIR} -DDEBUG
${BIN_TARGET}:${O}
$(CC) $(O) -o $@ ${LIBDIR} -ljson -lcurl
#利用makefile自动推导功能和自动化变量,用一条语句实现同一个目录下多个源文件的编译
#以下为根据多个源文件的目录添加多个
${DIR_O}/%.o:${DIR_SRC0}/%.cpp
$(CC) $(CFLAGS) -c $< -o $@ ${INCDIR}
${DIR_O}/%.o:${DIR_SRC1}/%.cpp
$(CC) $(CFLAGS) -c $< -o $@ ${INCDIR}
#下面可以添加每个目标文件的依赖的头文件,来实现头文件的更新带动目标文件的更新
#当然也可以不添加,但是这样做带来的后果就是,当修改了某个头文件,include该头文件的源文件不会被重新编译。这一点要切记。
${DIR_O}/main.o : defs.h
${DIR_O}/kbd.o : defs.h command.h
${DIR_O}/command.o : defs.h command.h
${DIR_O}/display.o : defs.h buffer.h
${DIR_O}/insert.o : defs.h buffer.h
.PHONY:clean
clean:
find ${DIR_O} -name *.o -exec rm -rf {}
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-40643-5.html
烊烊
去不了好想去我凡~
美照再一发