一个简单的makefile讲解
#宏的格式为:= CC表示编译器的名称
CC := gcc
LD := ld
INCDIR := ../include
LIBDIR := ../lib
#CFLAGS表示给编译器的编译选项
CFLAGS := -I$(INCDIR) -c -Wall -g
#LDFLAGS表示在编译的时候编译器的链接库选项
LDFLAGS := -L$(LIBDIR) -static -lpthread
#wildcard函数,它有一个参数,功能是展开成一列所有符合由其参数描述的文件名,文件间以空格间隔
#以下命令表示:产生一个所有以".c"结尾的文件列表,然后存入变量SOURCES里。当然结果可存入多个变量
SOURCES := $(wildcard *.c)
#patsubst函数有3个参数:第一个是个需要匹配的式样,第二个表示用什么来替换他,第三个是个需要被处理的
#由空格分隔的字列。这行将处理所有在 SOURCES 字列中的字(一列文件名),
#如果他的 结尾是 ’.c’ ,就用 ’.o’ 把 ’.c’取代。注意这里的 % 符号将匹 配一个或多个字符,
#而他每次所匹配的字串叫做一个‘柄’(stem) 。 在第二个参数里, %被解读成用第一参数所匹配的那个柄
OBJS := $(patsubst %.c,%.o,$(SOURCES))
TARGET := ipc
all:$(TARGET)
#"$<"表示第一个依赖文件名称 "$@"表示目标集 "s^"所以依赖文件,以空格隔开
#当前目标的基名由宏“$*”来代替。例如目标的名字是hello.o,则基名就是除去了后缀.o的hello
ipc:$(OBJS)
@echo $@
$(CC) $^ $(LDFLAGS) -o $@
#gcc ipc_main.o listsOperator.o parser.o receiver.o sem.o vs_socket.o vs_thread.o -L../lib -static -lpthread -o ipc
#"$<"表示第一个依赖文件名称(当前源文件.c) "$@"表示目标集 (当前目标文件.o)
#"%.o"表明要所有以".o"结尾的目标 依赖模式"%.c"则取模式"%.o"的"%",并为其加上.c
%.o: %.c
$(CC) $< $(CFLAGS) -o $@
#gcc ipc_main.c -I../include -c -Wall -g -o ipc_main.o
#gcc listsOperator.c -I../include -c -Wall -g -o listsOperator.o
#.........
.PHONY:clean
clean:
-rm -f $(TARGET) *.o *~
#.PHONY表示clean是一个"伪目标"。而在rm命令前面加一个减号意思是:也许某些文件出现问题,
#但不要管,继续做后面的事。clean从来都是放在文件的最后