歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

用於編譯C/C++的一個通用Makefile文件

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  
Copyright © Linux教程網 All Rights Reserved