当写的源代码多了,工程多了,如果用手动的去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就可以了...