一个通用的Makefile(针对非模块类pro)

       makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具。

       本文提供的Makefile文件主要针对简单的linux平台下的C语言程序。而且是针对非模块类程序(该中下一博文中介绍)。

 

SRCS = $(wildcard *.c)
OBJS = $(SRCS:.c = .o)
CC = gcc
INCLUDES = -I/home/lewiyon/build/include
LIBS = -L/home/lewiyon/build/lib -lpthread
CCFLAGS = -g -Wall -O0
main : $(OBJS)
	$(CC) $^ -o $@ $(INCLUDES) $(LIBS) 
%.o : %.c
	$(CC) -c {1}lt;; $(CCFLAGS) 
clean:
	-rm *.o
	-rm main


解析:

       第一行会产生一个所有以 '.c' 结尾的文件的列表,然后存入变量SRCS里。当然不需要一定把结果存入一个变量。

       第二行会产生一个所有以 '.o' 结尾的文件的列表,然后存入变量OBJS中。即SRCS中变量列表中的所有的".c"变成".o"存入OBJS变量中。

       第三行表示编译器是GCC。

       第四行与第五行指定除了编译器默认的头文件和库文件的路径之外需要额外引用的头文件路径以及库的路径;可不设定。

       第六行表示CC编译器的编译选项。

       第七行、第九行分别表示main的生成依赖于文件列表OBJS;.o文件的生成依赖于.c文件.

       第八行表示main依赖于所有的.o文件,$^代表$(OBJS),$@代表main。

       第十行表示将所有的.c源代码编译成.o目标文件。亦可使用 $(CC) -c {1}lt; $(CCFLAGS) 

       第十一、十二行表示如使用命令make clean,则删除main,及.o文件。-rm表示忽略错误。

  $* 不包含扩展名的目标文件名称。  $+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。  $< 第一个依赖文件的名称。  $? 所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚。  $@ 目标的完整名称。  $^ 所有的依赖文件,以空格分开,不包含重复的依赖文件。  $% 如果目标是归档成员,则该变量表示目标的归档成员名称。


   

原文地址:https://www.cnblogs.com/youngerchina/p/5624628.html