當寫的源代碼多了,工程多了,如果用手動的去gcc/g++,相信,碰到boost這個工程,那只能是瘋掉了。
古老的工具,也往往是最有用的,這個工具就是makefile。我在05年就把陳皓的博文整理成pdf。沒有別的,只是為它增加了一個目錄,方便閱讀。
因為本人是非常懶的,不喜歡一頁一頁的去找。這個文檔的名稱是《跟我一起寫 Makefile》。(注現在陳皓的主頁是cocre.com,上面有很多有意思的文章,強烈建議大家去看)
我編譯工程也是非常懶的,如果每增加一個cpp文件,讓我去修改makefile也是頭痛的事。所以編寫一個半自動的makefile會省事很多。翻出舊箱底,重新整理了一個makefile。一個重要的功能就是,只要往對應的目錄中丟.cpp就可以通過make命令,將這個cpp自動編譯進去
首先:是工程名稱
#工程名稱
name := sample 1
其次是程序名稱:
#程序名
program := 1
然后,就是包含目錄、編譯選項、源文件目錄等等
INCLUDE := -I.
LIBS := -lpthread -lrt
CPP := g++
CC := gcc
MACRO_DEFINE := -D__linux__ -D__PTHREADS__ -D__PTHREADS_MUTEXES__ -DUSE_THREAD
CPPFLAGS := -Wall -Werror $(INCLUDE) -w $(INCLUDE_FLAG) $(MACRO_DEFINE) -static
CFLAGS := $(CPPFLAGS)
RM := rm -f
SRCDIRS := .
SRCEXTS := .cpp .c
SOURCES := $(foreach d,$(SRCDIRS),$(wildcard $(addprefix $(d)/*,$(SRCEXTS))))
OBJS := $(foreach x,$(SRCEXTS),$(patsubst %$(x),%.o,$(filter %$(x),$(SOURCES))))
DEPS := $(patsubst %.o,%.d,$(OBJS))
然后編譯目標
我的工作目標有all(默認的),rebuild(重新編譯),clean(清理),show(顯示變量值) ,run(執行),clean all(全部清理)
具體的makefile原理,請查看<跟我一起寫 Makefile>,不知道就用google搜一下,到處都有下載的pdf。
下面是這次makefile內容
1 #工程注釋
2
3 #工程名稱
4 name := sample 1
5 #程序名
6 program := 1
7
8 INCLUDE := -I.
9 LIBS := -lpthread -lrt
10 CPP := g++
11 CC := gcc
12 MACRO_DEFINE := -D__linux__ -D__PTHREADS__ -D__PTHREADS_MUTEXES__ -DUSE_THREAD
13 CPPFLAGS := -Wall -Werror $(INCLUDE) -w $(INCLUDE_FLAG) $(MACRO_DEFINE) -static
14 CFLAGS := $(CPPFLAGS)
15 RM := rm -f
16
17 SRCDIRS := .
18 SRCEXTS := .cpp .c
19 SOURCES := $(foreach d,$(SRCDIRS),$(wildcard $(addprefix $(d)/*,$(SRCEXTS))))
20 OBJS := $(foreach x,$(SRCEXTS),$(patsubst %$(x),%.o,$(filter %$(x),$(SOURCES))))
21 DEPS := $(patsubst %.o,%.d,$(OBJS))
22
23
24
25 .PHONY : all objs clean rebuild cleanall
26
27 all:$(program)
28 %.d : %.c
29 @echo D
$<
30 @$(CC) -MM -MD $(CFLAGS) $<
31 %.d : %.C
32 @echo D
$<
33 @$(CC) -MM -MD $(CFLAGS) $<
34 %.d : %.cpp
35 @echo D
$<
36 @$(CPP) -MM -MD $(CPPFLAGS) $<
37 %.d : %.CPP
38 @echo D
$<
39 @$(CPP) -MM -MD $(CPPFLAGS) $<
40 %.d : %.cc
41 @echo D
$<
42 @$(CC) -MM -MD $(CPPFLAGS) $<
43 %.d : %.CC
44 @echo D
$<
45 @$(CC) -MM -MD $(CPPFLAGS) $<
46
47 objs:$(OBJS)
48 %.o : %.c
49 @echo Compiling
$<
50 @$(CC) $(CFLAGS) -c $< -o $(patsubst %.c,%.o,$<)
51 %.o : %.C
52 @echo Compiling
$<
53 @$(CC) $(CFLAGS) -c $< -o $(patsubst %.C,%.o,$<)
54 %.o : %.cpp
55 @echo Compiling
$<
56 @$(CPP) $(CPPFLAGS) -c $< -o $(patsubst %.cpp,%.o,$<)
57 %.o : %.CPP
58 @echo Compiling
$<
59 @$(CPP) $(CPPFLAGS) -c $< -o $(patsubst %.CPP,%.o,$<)
60 %.o : %.cc
61 @echo Compiling
$<
62 @$(CC) $(CPPFLAGS) -c $< -o $(patsubst %.cc,%.o,$<)
63 %.o : %.CC
64 @echo Compiling
$<
65 @$(CC) $(CPPFLAGS) -c $< -o $(patsubst %.CC,%.o,$<)
66
67
68 $(program) : $(OBJS)
69 $(CPP) -o $(program) $(OBJS) $(LINKOPTS) $(LIBS)
70
71 -include $(DEPS)
72
73 clean:
74 @$(RM) *.o *.log
75
76 cleanall: clean
77
78 rebuild: cleanall all
79
80 run:
81 @./$(program)
82
83
84 show:
85 @echo program=$(program)
86 @echo name=$(name)
87 @echo MACRO_DEFINE=$(MACRO_DEFINE)
88 @echo SRCDIRS=$(SRCDIRS)
89 @echo SRCEXTS=$(SRCEXTS)
90 @echo SOURCES=$(SOURCES)
91 @echo OBJS=$(OBJS)
92 @echo DEPS=$(DEPS)
93 @echo LIBS=$(LIBS)
94 @echo CC=$(CC)
95 @echo CPP=$(CPP)
96 @echo INCLUDE=$(INCLUDE)
97 @echo CPPFLAGS=$(CPPFLAGS)
98 @echo CFLAGS=$(CFLAGS)
99
100
后面復習的日子,就是編寫源文件,然后make就可以了...