黑马程序员技术交流社区

标题: makefile的基础知识 [打印本页]

作者: 道南路    时间: 2017-11-6 14:06
标题: makefile的基础知识
#目标:依赖
#    规则(记得规则前面要加一个table)

#自动变量
# $@:规则中的目标
# $<:规则中的第一个依赖
# $^:规则中的所有依赖
# 只能在规则的命令中使用

#makefile第一个版本,
#app:head.h main.c add.c sub.c mul.c div.c
#    gcc head.h main.c add.c sub.c mul.c div.c -o app
#缺点:这样的效率太低,需要编译其中某一个文件时,会全部编译,需要改进

#makefile第二个版本,检测目标时间是否是大于依赖时间,不大于就重新生成依赖,
#app:head.h main.o add.o sub.o mul.o div.o
#    gcc head.h main.o add.o sub.o mul.o div.o -o app

#生成.o文件,规则里面是可以加绝对目录的,如果想生成到特定的目录里面,可加相关的路径
#main.o:main.c
#    gcc main.c -c

#add.o:add.c
#    gcc add.c -c

#sub.o:sub.c
#    gcc sub.c -c

#mul.o:mul.c
#    gcc mul.c -c

#div.o:div.c
#    gcc div.c -c
#
#makefile第二个版本缺点:冗余太多



#makefile第三个版本
#用变量来替代重复使用的依赖
自动变量
# $@:规则中的目标
# $<:规则中的第一个依赖
# $^:规则中的所有依赖
# 只能在规则的命令中使用
#obj=head.h main.o add.o sub.o mul.o div.o

#app:$(obj)
#    gcc $(obj) -o app

#%.o:%.c
#    gcc -c $< -o $@
#模式匹配
#makefile第三个版本,缺点可移植性差



#makefile第四个版本,可移植性高
#查找指定目录指定类型的文件:wildcard,使用相应的函数

#src=$(wildcard ./*.c) 当前目录,所有.c的文件
#匹配替换
#obj=$(patsubst %.c,%.o,$(src))  将里面所有.c的文件替换为.o的文件,.c文件是从src里面获取

src=$(wildcard ./*.h *.c)
obj=$(patsubst %.c,%.o,$(src))
target=app
$(target):$(obj)
    gcc $^ -o $@

%.o:%.c
    gcc -c $< -o $@

#makefile第四个版本,可移植性高,但是不能清理项目


#makefile第五个版本,再增加一个清理项目的规则
#clean:
#    rm *.o app

#没有依赖,只有目标,这样就可以通过make hello直接执行目标 ,测试用
#hello:  
#   echo "hello kevin"

#可选择性的执行目标,使用make clean执行下面的规则,没有依赖,只有目标和规则
#clean:
#    rm *.o app
#可以在规则最前面加减号 - :意思是规则执行失败后,继续执行后面的命令
#声明伪目标:不做更新和检查 :.PHONY:clean,即使目录文件有文件和命令是同名的也可以执行目标命令
.PHONY:clean
clean:
    -rm $(obj) $(target)




作者: xiaolili    时间: 2017-11-6 15:09
宝宝好棒
作者: 々沉默〃    时间: 2017-11-6 18:26
66666666666666
作者: 播妞    时间: 2017-11-8 09:55





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2