makefile 多行注释_makefile 如何注释_makefile注释(5)

电脑杂谈  发布时间:2017-04-11 05:09:03  来源:网络整理

上面的”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

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...