「这是我参与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]键做为开始(不然就被认 为是命令)