CC = gcc
LD = gcc
CFLAGS = -Wall -c -Dgliethttp -I../include -L lib_path
LDFLAGS = -lpthread
RCS = $(wildcard *.c source/*.c)
OBJS = $(patsubst %c, %o, $(SRCS))
TARGET = gliethttp
.PHONY: all clean
all: $(TARGET)
$(TARGET): $(OBJS)
@$(LD) $(LDFLAGS) -o $@ $^
%o: %c
@$(CC) $(CFLAGS) -o $@ $<
clean:
@rm -f *.o $(TARGET)
1,特殊符号:四个特殊符号的意义@、$@、$^、$
@:这个符串通常用在“规则”行中,表示不显示命令本身,而只显示它的结果;否则会显示打印该命令信息
$@ --代表目标文件(target) ,如例子的:$(TARGET)
$^ --代表所有的依赖文件(components) ,@$(LD) $(LDFLAGS) -o $@ $^ ;$^代表$(OBJS)所有.o
$< --代表第一个依赖文件(components中最左边的那个),@$(CC) $(CFLAGS) -o $@ $< ;$< 代表依赖的%c.
2,编译文件和依赖文件的获取
RCS=$(wildcard *.c source/*.c)是为了找出目录和指定目录下所有的后缀为c和cpp的文件,这个功能也可以使用RCS=$(shell echo *.c)实现。
OBJ=$(patsubst %c, %o, $(SRCS))中是为了将所有的cpp文件的后缀替换为o文件,这个功能也可以通过CPP_OBJ=$(CPP_SRC:%.c=%.o)实现 ,替换引用规则,即用您指定的变量替换另一个变量。
它的标准格式是$(var:a=b) 或 ${var:a=b};
3,编译c后缀和cpp后缀文件的规则,后缀规则是一种老风格定义隐含规则的方式。新版本的make中使用模式规则取代了这种实现方式,模式规则和它相比更加清晰明了。现在版本保留它的原因只是为了能够兼容旧的makefile文件。
后缀规则有两种类型:“双后缀”和“单后缀”。
双后缀规则定义一对后缀:目标文件的后缀和依赖目标的后缀。它匹配所有后缀为指定目标后
缀的文件名。对于一个匹配的目标文件,它的依赖文件是这样形成:将目标文件中的后缀替换为依
赖文件的后缀之后得到。如:一个描述目标和依赖后缀的“.o”和“.c”的规则就等价于模式规则
“%o : %c”。
单后缀规则只定义一个后缀:此后缀是源文件的后缀。它可以匹配任何文件,其依赖文件名是
这样形成:将源文件后缀追加到目标文件名之后得到。例如:单后缀“.c”就等价于模式规则“% :
%.c”。
后缀规则的识别过程:比较make本身所定义的后缀和规则中出现的后缀,如果规则的目标中
只有一个可识别的后缀,则这个规则是一个“单后缀”规则;当规则的目标中有两个可识别的后缀
时,这个规则就是“双后缀”规则
.c.s:
@$(CC) $(CCFLAGS) -S $<
.s.o:
@$(AS) $(ASFLAGS) -o $*.o $<
.c.o:
@$(CC) $(CCFLAGS) -o $*.o -c $<
@echo [ $*.c Compiled ... ... ]
.cpp.o:
@$(C++) $(CCFLAGS) -o $*.o -c $<
@echo [ $*.cpp Compiled ... ... ]
.c.o和.cpp.o,是为了通配编译c后缀和cpp后缀文件的规则,
“.c”和“.o”都是make可识别的后缀。因此当定义了一个目标是“.c.o”的规则时。
make会将它作为一个双后缀规则来处理,它的含义是目标为“.o”文件、依赖为“.c”文件。下
边是使用后追规则定义的、编译.c源文件的规则:
.c.o:
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
一个后缀规则依赖关系描述中不能包含依赖文件。否则,此规则将被作为一个普通规则对待。因此
规则:
.c.o: foo.h
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
它不是一个后缀规则。它是目标文件为“.c.o”、依赖文件是“foo.h”的普通规则。它不等价于规
则:
%.o: %.c foo.h
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
需要注意的是:没有命令行的后缀规则是没有任何意义的。它和没有命令行的模式规则不同,它并不
能取消之前使用后追规则定义的规则。它所实现的仅仅是将这个后缀规则作为目标加入到make的数据库中。
可识别的后缀指的是特殊目标“.SUFFIXES”的所有依赖的名字。通过给特殊目标“SUFFIXES”添加依赖来增加
一个可被识别的后缀:
.SUFFIXES: .hack .win
它所实现的功能是把后缀“.hack”和“.win”加入到可识别后缀列表的末尾。
如果需要重设默认所有的可识别后缀,可以这样来实现:
.SUFFIXES: #删除所有已定义的可识别后缀
.SUFFIXES: .c .o .h #重新定义
其过程是首先使用没有依赖的特殊目标“.SUFFIXES”来删除所有已定义的可识别后缀;之后再重新定义。
注意: make的“-r”或“-no-builtin-rules”可以清空所有已定义的可识别后缀。
5,去除路径:
file:$(notdir $(src))
继续阅读与本文标签相同的文章
-
零基础Python教程033期 循环中的else语句,感叹人生苦短,我学python
2026-05-18栏目: 教程
-
Python高级进阶#015 pyqt5进度条QProgressBar结合使用qbasictimer
2026-05-18栏目: 教程
-
Cassandra编年史
2026-05-18栏目: 教程
-
网站建设——部署与发布入门篇(基于阿里云服务器)
2026-05-18栏目: 教程
-
K8S从懵圈到熟练 - 节点下线姊妹篇
2026-05-18栏目: 教程
