Makefile 实际用例分析(一) ------- 比较通用的一种架构

这里不再说Makefile的基本知识,如果需要学习,那么请参考: 下载:makefile 中文手册

或者

点击打开链接

或者

跟我一起写Makefile( 陈皓 )

 

这里说的是一般的实际的一个工程应该怎么去写。

环境:ubuntu 10.04

 

先看看我的文件的分布情况:

顶层:

然后src中:是所有的源程序以及头文件( 我这里是使用自己的IR树的代码作为实验 )

 

而build文件夹是为了编译使用的!下面有:

obj文件夹里面放的是编译过程中的.o和.d文件,还有一个subdir.mk的子文件,

用于指示怎么生成.o

obj中:

 

下面我们从顶层开始慢慢分析:

 

*******温馨提示:下面的注释是为了方便处理,写在每一条语句后面,其实这样的风格是不好的,所以,如果

       你使用了这个makefile,请将注释换行...或者去掉,否则可能编译异常!谢谢记住!

*******

 

最外层的makefile:

 

[plain] view plain copy

 

 print?

  1. SHELL = /bin/sh             # 这个地方是指示使用的shell是sh  
  2. EXEC = ir_tree              # 最终生成的binary的名称  
  3. BUILD_DIR = build           # 这个子文件夹,此处也就是我们build文件夹  
  4.   
  5. all:                        # all在此处是终极目标,这个你应该知道的。一般我们make的时候,第一个目标作为终极目标  
  6.     @( cd ${BUILD_DIR}; make )  # 这句是进去build文件夹去执行那个makefile  
  7.                                 
  8. clean:                      # clean就不说了  
  9.     @echo 'start clean...'  
  10.     @($(RM) $(EXEC))  
  11.     @(cd ${BUILD_DIR}; make clean)  
  12.     @echo 'Finished!'  
  13.     @echo ''  

 

 

现在进入build文件夹,看这个文件夹下面的makefile

 

[plain] view plain copy

 

 print?

  1. SHELL = /bin/sh            # 同上  
  2.   
  3. INCLUDE_DIR :=             # include文件夹,一般我们在引用库的时候,需要将其头文件放在一个include中,然后自己的程序                           # 编译的时候需要包含这个include,例如-I$(<span style="font-family: SimHei;">INCLUDE_DIR</span><span style="font-family: SimHei;">)</span>  
  4. LIB_DIR := -lm             # 引入的库  
  5. EXEC = ../ir_tree          # 这是一个最终binary名称,这里是将这个可执行放在了上层文件夹中  
  6.   
  7. -include obj/subdir.mk     # 这个地方是include了一个子文件  
  8.                            # 这里子文件作用是,为了生成所有的.o文件(当然附带生成.d文件!),生成.o之后,才能回到这一                           # 层的makefile进行链接成最终的可执行的操作!具体操作我们稍后再看  
  9.   
  10. all:${EXEC}                # 好!这里是这个makefile的第一个目标。即终极目标,所有需要找<span style="font-family: SimHei;">${EXEC}的生成规则!</span>  
  11.   
  12. ${EXEC}: ${OBJS}           # <span style="font-family: SimHei;">${EXEC}的生成规则,注意这里我们没有看到$(OBJS),那是因为在</span><span style="font-family: SimHei;">obj/subdir.mk中!</span><span style="font-family: SimHei;">  
  13. </span> @echo ' Building target: $@ '  
  14.     gcc -o $@ $(OBJS) $(LIB_DIR)   # 这一句就是为了将所有的.o文件 + 引用的库 链接起来,生成最后的$@,也就是$(EX                                       # EC),也就是最后的binary!  
  15.     @echo 'Finished building target: $@'  
  16.     @echo ''  
  17.   
  18. clean:  
  19.     @echo 'start rm objs and deps ...'  
  20.     $(RM) $(OBJS) \  
  21.     $(C_DEPS)  
  22.     @echo 'Finish rm objs and deps ...'  
  23.   
  24. .PHONY: all clean                      # 伪目标  
  25. .SECONDARY:  

下面需要看看obj中的subdir.mk的内容了!这个是为了生成所有的.o文件。

 

同时!请注意:当我们的一个.c或者.h被修改之后,需要重新编译!这一点非常重要!

特别是.h被修改的时候,不能忘记重新编译( 当然,有些时候.h修改,我们不需要编译,这个先暂时不说,后面在讨论!其实,你使用一个make --touch就可以~ )

 

[plain] view plain copy

 

 print?

  1. C_SRCS += \            # 所有的.c文件,当然你喜欢使用wildcard也是可的!  
  2. ../src/card.c \        # $(<span style="font-family: SimHei;">wildcard ../src/*.c</span><span style="font-family: SimHei;">)</span>  
  3. ../src/index.c \  
  4. ../src/node.c \  
  5. ../src/rect.c \  
  6. ../src/split_l.c \  
  7. ../src/test.c  
  8.   
  9. OBJS += \             <span style="font-family: SimHei;"># 所有的.c文件,当然你喜欢使用wildcard也是可的!</span>  
  10. ./obj/card.o \        # OBJS = $(patsubst %.c,%.o,$(wildcard ../src/*.c))  
  11. ./obj/index.o \       # 但是你要将src文件目录改成obj的 <span style="font-family: SimHei;">OBJS := $(addprefix "./obj/",$(notdir $(OBJS)))</span>  
  12. ./obj/node.o \  
  13. ./obj/rect.o \  
  14. ./obj/split_l.o \  
  15. ./obj/test.o  
  16.   
  17. C_DEPS += \          # deps  
  18. ./obj/card.d \  
  19. ./obj/index.d \  
  20. ./obj/node.d \  
  21. ./obj/rect.d \  
  22. ./obj/split_l.d \  
  23. ./obj/test.d  
  24.   
  25. all: $(OBJS)        # 注意在这个subdir中,这个是终极目标,也就是所有的objs  
  26.   
  27. obj/%.o: ../src/%.c ./obj/%.d    #这里是o文件的依赖规则:注意是.c和.d同时成为依赖,.d文件中是一个目标的所有的依赖文                                 # 件,包括.c和.h文件,所有一旦.h被修改,这个地方也是可以识别的!  
  28.     @echo 'start building $< ...'  
  29.     gcc -O3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" \  
  30. -MT"$(@:%.o=%.d)" -o "$@" "$<"  
  31.     @echo 'Finished building: $< '  
  32.     @echo ''  
  33.   
  34. -include $(C_DEPS) # 注意:这里将所有的.d文件引入!注意,第一次引入时候,没有.d文件,会寻找.d的生成规则,也就是下面                   # 的,这个.d又是依赖.c文件的,所有,一旦一个.c文件中多了一个头文件之类,又可以跟新.d,从而,执行                   # 上面的.o生成时候,就能够实时跟新  
  35.   
  36. ./obj/%.d: ../src/%.c   # 注意:这里为了生成.d  
  37.     @echo 'start building $(notdir $@)...'  
  38.     $(CC) $< $(INCLUDE) -MM -MD -o $@  

好了,上面所有的都分析完了,然后可以make一下,.、ir_tree 看看效果吧~

 

 

如果你要下载这个工程,我已经上传了,你可以免费下载:ir_tree

from:http://blog.csdn.net/shanshanpt/article/details/17198413

时间: 2024-09-09 20:18:15

Makefile 实际用例分析(一) ------- 比较通用的一种架构的相关文章

Makefile 实际用例分析(二) ------- 比较通用的一种架构

之前已经讲了这一篇文章:Makefile实际用例分析(一)-----比较通用的一种架构 现在这篇其实和那个差的不是很多,只是在布局上有些差别(这个makefile也是论坛上一起讨论过的,囧,忘了哪个论坛)   还是先看看基本的文件布局: 介绍: debug是调试版本的binary文件夹 release是发行版本binary文件夹 src是所有的源文件文件夹. lib是引用库 include一般是引用库头文件之类,或者其他头文件 obj所有.o文件和.d文件   src中:依然使用之前的那个ir_

Makefile 实际用例分析(三) ------- 是用GUN automake 处理自己的工程

前面两篇已经说过了自己怎么去为一个工程写makefile: 第一篇 第二篇   现在这一篇说的是怎么使用GNU的工具去写一个符合开源标准的Makefile呢! 首先我觉你应该参考: Automake Autoconf   这里就一步一步来解释:依然使用之前两篇中的例子ir_tree!   还是先看看我的文件布局是怎么样的!   顶层文件夹:相比之前多了Makefile.am和configure.ac文件,还有四个辅助文件( 顾名思义,我就不多说了 ): AUTHORS. ChangeLog. N

OO系统分析员之路--用例分析系列(8)--如何编写一份完整的UML需求规格说明书

终于到了快结束的时候了,这将是用例分析系列的最后一篇,结果是得到需求规格说明书,以结束需求分析的过程.经过前面七篇的工作,我们从最初的业务用例获取入手,获得了业务用例模型,这是我们的业务范围:经过分析得到了业务场景,这是我们的业务蓝图:经过规划,得出用例实现视图,这是我们的系统范围:经过再次分析,得到了用例实现以及领域模型,包括用例规约,业务规则和业务数据,这是我们的概念模型.仅从需求所需的必要元素来说,我们基本上已经完成了需求分析的工作.诚如上一篇结尾所说,为了让我们的需求更完美,这一篇所要做

OO系统分析员之路--用例分析系列(5)--用户、业务用例和业务场景

很久没有动笔了,这期间承蒙许多朋友的喜欢和鼓励,再不写点东西就对不住这些朋友了. 写点什么呢?按照原先的设想,应该开始动手写如何从业务用例转化到概念用例和系统用例,不过老实说这一步需要的是经验居多,而很难找出一个普适的步骤来.先暂时放一放吧,以后一定会写到的.上一篇讲到用例分析的一般步骤和方法,也给出了一个实例,不过没有做更进一步的说明,所以这一篇,笔者决定先罗嗦罗嗦之前的内容,说说业务建模中各种图的用法,以及它们对需求的贡献. 在说明实例之前,再重复一下的需求,并提醒读者下载实例,本文下面只会

OO系统分析员之路--用例分析系列(2)--什么是用例

我发现,在OO和UML几乎一统天下的今天,仍有很多系统分析员对OO和UML一知半解,甚至包括很多已经使用了很久UML的系统分析员. 于是打算写一个系列文章,将多年来的工作经验做一个总结.对初学者起个启蒙作用,也希望抛砖引喻,与各路大虾共同探讨,共同提高. 这个系列文章将以我对OO和系统分析的理解为主,从UML基础开始,阐述面向对象的需求分析方法,过程,并以RUP为例,阐述如何将OO过程与软件过程有机结合在一起,做一个真正OO应用. 好了,今天是第一篇.想得很远,不知能否坚持下去,呵呵:lol:

连载:面向对象葵花宝典:思想、技巧与实践(18) - 用例分析

很多人在分析需求的时候,采用的是东扯葫芦西扯瓢的方式,列出了很多的需求点,但当你看完后,你还是不知道到底要干嘛!!  ---- 写在前面 用例,英文名称Use Case,英文和中文都是很好理解,因为大家都这么用,我们暂且不去追究名称上的问题,只要知道"用例是用来描述需求的流程",即:描述5W1H中的How.   看起来用例应该很好写,因为用例是描述需求的流程的,而需求的流程一般都是客户根据自己的业务总结出来,然后告诉我们的.我们只要将客户描述的内容记录下来即可,既简单又轻松!   但现

微软云计算的互操作性和用例分析

微软云计算的互操作性和用例分析 段雪明 [内容] 微软云计算概况 微软云计算方案特点 互操作案例分析 [下载地址]:http://bbs.chinacloud.cn/showtopic-13202.aspx

实用代码分析:JavaScript通用表单验证函数

javascript|表单验证|函数 Check.js   JS函数文件/////////////////////////////////////////////////////////////////////////////////* *--------------- 客户端表单通用验证CheckForm(oForm) ----------------- * 功能:通用验证所有的表单元素. * 使用: *    <form name="form1" > *    <

以“祛痘产品”关键词为例分析如何解读关键词的竞争度

对于一个SEO项目来说,成功与否很大程度上是基于关键词的抉择是否正确.假如你选择的是竞争度低但是相关度小的词,即使获得流量也是没有多大的效果.而如果你选择了一个高度相关,但是竞争度异常高的词,那么你也很难在短期内有一定的收益.判断关键词的竞争方式也有很多种,假如你只是借助其中一种,那将会有很高的误差率.基于这点,下面笔者就以"祛痘产品"这个关键词为例,谈谈如何解读一个关键词的竞争度. 一:分析搜索结果的数量 当我们找到一个关键词后,我们只要搜索这一个词就可以从搜索结果中获得一定的数据.