用于编译C/C++的一个通用Makefile文件

linuxjourney 2011-09-27

Ideal:在Linux C下,每当编写一些小程序或较大的项目时,都要进行重复的gcc编译命令,是否可以编写一个通用的Makefile文件,通过执行make命令实现编译(好像正是设计Makefile的意图之一,呵呵),了解相关Makefile编写规则后,初步实现了一个较为简单的Makefile文件,往后遇到实际的问题,将不断完善Makefile的功能。

这个Makefile主要针对GCC和GNU Make环境编写,其它版本的编译器和Make不能保证正常工作。

如果您发现本文中的错误,或者对本文有什么感想和意见,可以通过 jikhkhong AT gmail DOT com邮箱与作者联系。

以下是具体的实现过程:

实现的功能:

  • make——编译和连接程序
  • make objs——编译程序,生成目标文件
  • make clean——清除编译产生的目标文件(*.o)和依赖文件(*.d)
  • make cleanall——清除目标文件(*.o)、依赖文件(*.d)和可执行文件(*.exe)
  • make rebuild——重新编译连接程序,相当于make clean && make
Usage:

Makefile源代码

  1. # Gneric C/C++ Makefile  
  2. ####################################################   
  3. PROGRAM :=  
  4. SRCDIRS :=  
  5. SRCEXTS :=  
  6. CPPFLAGS :=  
  7. CFLAGS :=  
  8. CFLAGS +=  
  9. CXXFLAGS :=  
  10. CXXFLAGS +=  
  11. LDFLAGS :=  
  12. LDFLAGS +=  
  13.   
  14. SHELL = /bin/sh  
  15. SOURCES = $(foreach d,$(SRCDIRS),$(wildcard $(addprefix $(d)/*,$(SRCEXTS))))  
  16. OBJS = $(foreach x,$(SRCEXTS),\  
  17.        $(patsubst %$(x),%.o,$(filter %$(x),$(SOURCES))))  
  18. DEPS = $(patsubst %.o,%.d,$(OBJS))  
  19.   
  20. .PHONY: all objs clean cleanall rebuild  
  21.   
  22. all : $(PROGRAM)  
  23.   
  24. %.d : %.c  
  25.     @$(CC) -MM -MD $(CFLAGS) {1}lt;  
  26.   
  27. %.d : %.C  
  28.     @$(CC) -MM -MD $(CXXFLAGS) {1}lt;  
  29.   
  30. objs : $(OBJS)  
  31.   
  32. %.o : %.c  
  33.     $(CC) -c $(CPPFLAGS) $(CFLAGS) {1}lt;  
  34.   
  35. %.o : %.cpp  
  36.     $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) {1}lt;  
  37.   
  38. $(PROGRAM) : $(OBJS)  
  39. ifeq ($(strip $(SRCEXTS)),.c)  
  40.     $(CC) -o $(PROGRAM) $(OBJS) $(LDFLAGS)  
  41. else  
  42.     $(CXX) -o $(PROGRAM) $(OBJS) $(LDFLAGS)  
  43. endif  
  44.   
  45. -include $(DEPS)  
  46.   
  47. rebuild: clean call  
  48.   
  49. clean:  
  50.     @$(RM) *.o *.d  
  51.   
  52. cleanall: clean  
  53.     @$(RM) $(PROGRAM) $(PROGRAM).exe  

相关推荐