专职C++

不能停止的脚步

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  163 Posts :: 7 Stories :: 135 Comments :: 0 Trackbacks

常用链接

留言簿(28)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

当写的源代码多了,工程多了,如果用手动的去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就可以了...
posted on 2010-12-15 00:27 冬瓜 阅读(2943) 评论(3)  编辑 收藏 引用 所属分类: 原创

Feedback

# re: 从0开始复习linux四:使用makefile 2010-12-17 21:27 清正
博主 可否详细解释一下 第19行:
SOURCES := $(foreach d,$(SRCDIRS),$(wildcard $(addprefix $(d)/*,$(SRCEXTS))))

foreach 尚可理解, 但是 d 代表什么? wildcard addprefix 都是是什么命令?  回复  更多评论
  

# re: 从0开始复习linux四:使用makefile 2010-12-18 16:55 gifty
@清正
d相当于for中的i,是个迭代器,指示$(SRCDIRS)每一项,
wildcard,addprefix都是Make中的函数,你可以看下<跟我一起写 Makefile>,里面有很相信的讲解!  回复  更多评论
  

# re: 从0开始复习linux四:使用makefile 2010-12-18 20:44 清正
@gifty
谢谢博主, 习惯了c++ 但是对script语言还是不习惯, 没有类型声明, 直接使用 的这种方式。
我看过 pdf版本的 《更我一起写makefile》 没想到是你整理的啊!可惜,平时都是用visual studio, 看它也只是出于个人爱好 想了解一下, 没深入钻研。
  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理