當(dāng)寫(xiě)的源代碼多了,工程多了,如果用手動(dòng)的去gcc/g++,相信,碰到boost這個(gè)工程,那只能是瘋掉了。
古老的工具,也往往是最有用的,這個(gè)工具就是makefile。我在05年就把陳皓的博文整理成pdf。沒(méi)有別的,只是為它增加了一個(gè)目錄,方便閱讀。
因?yàn)楸救耸欠浅械模幌矚g一頁(yè)一頁(yè)的去找。這個(gè)文檔的名稱(chēng)是《跟我一起寫(xiě) Makefile》。(注現(xiàn)在陳皓的主頁(yè)是cocre.com,上面有很多有意思的文章,強(qiáng)烈建議大家去看)
我編譯工程也是非常懶的,如果每增加一個(gè)cpp文件,讓我去修改makefile也是頭痛的事。所以編寫(xiě)一個(gè)半自動(dòng)的makefile會(huì)省事很多。翻出舊箱底,重新整理了一個(gè)makefile。一個(gè)重要的功能就是,只要往對(duì)應(yīng)的目錄中丟.cpp就可以通過(guò)make命令,將這個(gè)cpp自動(dòng)編譯進(jìn)去
首先:是工程名稱(chēng)
#工程名稱(chēng)
name := sample 1
其次是程序名稱(chēng):
#程序名
program := 1
然后,就是包含目錄、編譯選項(xiàng)、源文件目錄等等
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))
然后編譯目標(biāo)
我的工作目標(biāo)有all(默認(rèn)的),rebuild(重新編譯),clean(清理),show(顯示變量值) ,run(執(zhí)行),clean all(全部清理)
具體的makefile原理,請(qǐng)查看<跟我一起寫(xiě) Makefile>,不知道就用google搜一下,到處都有下載的pdf。
下面是這次makefile內(nèi)容
1 #工程注釋
2
3 #工程名稱(chēng)
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
后面復(fù)習(xí)的日子,就是編寫(xiě)源文件,然后make就可以了...