歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 用於編譯C/C++的一個通用Makefile文件

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

日期:2017/3/1 11:17:20   编辑:Linux編程

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. SHELL = /bin/sh
  14. SOURCES = $(foreach d,$(SRCDIRS),$(wildcard $(addprefix $(d)/*,$(SRCEXTS))))
  15. OBJS = $(foreach x,$(SRCEXTS),\
  16. $(patsubst %$(x),%.o,$(filter %$(x),$(SOURCES))))
  17. DEPS = $(patsubst %.o,%.d,$(OBJS))
  18. .PHONY: all objs clean cleanall rebuild
  19. all : $(PROGRAM)
  20. %.d : %.c
  21. @$(CC) -MM -MD $(CFLAGS) {1}lt;
  22. %.d : %.C
  23. @$(CC) -MM -MD $(CXXFLAGS) {1}lt;
  24. objs : $(OBJS)
  25. %.o : %.c
  26. $(CC) -c $(CPPFLAGS) $(CFLAGS) {1}lt;
  27. %.o : %.cpp
  28. $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) {1}lt;
  29. $(PROGRAM) : $(OBJS)
  30. ifeq ($(strip $(SRCEXTS)),.c)
  31. $(CC) -o $(PROGRAM) $(OBJS) $(LDFLAGS)
  32. else
  33. $(CXX) -o $(PROGRAM) $(OBJS) $(LDFLAGS)
  34. endif
  35. -include $(DEPS)
  36. rebuild: clean call
  37. clean:
  38. @$(RM) *.o *.d
  39. cleanall: clean
  40. @$(RM) $(PROGRAM) $(PROGRAM).exe
Copyright © Linux教程網 All Rights Reserved