一个简单的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,则基名就是除去了后缀.ohello

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从来都是放在文件的最后

 

posted on 2010-12-03 09:37  springside5  阅读(242)  评论(0编辑  收藏  举报