Makefile简单笔记

245 阅读2分钟

「这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战

1、Makefile 的规则

目标:依赖文件
	指令

示例:

server:	server.o NetBYdw.o Net_epoll.o sign_in.o http.o
		g++ -g server.o NetBYdw.o Net_epoll.o sign_in.o http.o -o server 
server.o: server.cpp Net_epoll.h NetBYdw.h
		g++ -c server.cpp -o server.o -g
Net_epoll.o: Net_epoll.cpp Net_epoll.h
		g++ -c Net_epoll.cpp  -o Net_epoll.o -g
NetBYdw.o: NetBYdw.cpp NetBYdw.h
		g++ -c NetBYdw.cpp  -o NetBYdw.o -g
sign_in.o: sign_in.cpp sign_in.h
		g++ -c sign_in.cpp  -o sign_in.o -g
http.o: http.cpp http.h
		g++ -c http.cpp  -o http.o -g

clean:
	rm -rf server.o Net_epoll.o NetBYdw.o sign_in.o http.o

make命令工作过程

  • 在输入make命令后,会在当前目录下寻找名字叫“Makefile”或“makefile”的文件,当然也可以指定文件名,比如:make -f ddwmakefile

  • 如果找到,它会找文件中的第一个目标文件(target),或者指定目标比如:make clean

  • 根据目标文件的依赖,会去判断依赖文件是否需要更新(需要就会更新依赖文件),然后判断目标文件是否更新,需要则重新生成。

make 会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么 make 就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make 根本不理。make 只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,则出错退出。

make返回值

  • 0 : 表示成功执行。

  • 1 :如果 make 运行时出现任何错误,其返回 1

通配符

*、?的功能与linux的Bash-shell相同,~相当于$HOME,~用户名/test表示该用户目录下的test目录

伪目标

声明伪目标

“.PHONY”来显示地指明一个目标是“伪目标”,向 make 说明,不管是否有这个文件,这个目标就是“伪目标”。第一个示例的clean就是伪目标,虽然没有显示声明。调用方法”make clean“

显示命令

一般,make 会把其要执行的命令行在命令执行前输出到屏幕上。echo与Bashshell一样输出内容

两个命令分行,是不相互影响。与两个命令同行被;隔开第一条会影响到第二条

2、makefile的变量

变量的定义

variable=value 或

variable:=value

  • 注意:
    • =定义的变量可以使用后面的变量,:=不可以,在使用其他变量定义变量时最好使用:=以防陷入死循环,当然此时make也会报错

3、条件判断

ifeq、ifneq、ifdef、ifndef

ifeq

判断两个变量是否相等,比如ifeq ($(CC),gcc), ifeq ($(CC),)第二个时判断CC是否为空

ifneq

判断两个变量是否不相等,比如ifneq ($(CC),gcc), ifneq ($(CC),)第二个时判断CC是否不为空

ifdef

判断变量是否为非空,如果为空返回1,否则为0,注意ifdef 只是测试一个变量是否有值,其并不会把变量扩展到当前位置

ifndef

与ifdef相反,注意多余的空格是被允许的,但是不能以[Tab]键做为开始(不然就被认 为是命令)