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源代碼
- # Gneric C/C++ Makefile
- ####################################################
- PROGRAM :=
- SRCDIRS :=
- SRCEXTS :=
- CPPFLAGS :=
- CFLAGS :=
- CFLAGS +=
- CXXFLAGS :=
- CXXFLAGS +=
- LDFLAGS :=
- LDFLAGS +=
-
- SHELL = /bin/sh
- SOURCES = $(foreach d,$(SRCDIRS),$(wildcard $(addprefix $(d)/*,$(SRCEXTS))))
- OBJS = $(foreach x,$(SRCEXTS),\
- $(patsubst %$(x),%.o,$(filter %$(x),$(SOURCES))))
- DEPS = $(patsubst %.o,%.d,$(OBJS))
-
- .PHONY: all objs clean cleanall rebuild
-
- all : $(PROGRAM)
-
- %.d : %.c
- @$(CC) -MM -MD $(CFLAGS) {1}lt;
-
- %.d : %.C
- @$(CC) -MM -MD $(CXXFLAGS) {1}lt;
-
- objs : $(OBJS)
-
- %.o : %.c
- $(CC) -c $(CPPFLAGS) $(CFLAGS) {1}lt;
-
- %.o : %.cpp
- $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) {1}lt;
-
- $(PROGRAM) : $(OBJS)
- ifeq ($(strip $(SRCEXTS)),.c)
- $(CC) -o $(PROGRAM) $(OBJS) $(LDFLAGS)
- else
- $(CXX) -o $(PROGRAM) $(OBJS) $(LDFLAGS)
- endif
-
- -include $(DEPS)
-
- rebuild: clean call
-
- clean:
- @$(RM) *.o *.d
-
- cleanall: clean
- @$(RM) $(PROGRAM) $(PROGRAM).exe