Makefile 实际用例分析(一) ------- 比较通用的一种架构
这里不再说Makefile的基本知识,如果需要学习,那么请参考: 下载:makefile 中文手册
或者
或者
这里说的是一般的实际的一个工程应该怎么去写。
环境:ubuntu 10.04
先看看我的文件的分布情况:
顶层:
然后src中:是所有的源程序以及头文件( 我这里是使用自己的IR树的代码作为实验 )
而build文件夹是为了编译使用的!下面有:
obj文件夹里面放的是编译过程中的.o和.d文件,还有一个subdir.mk的子文件,
用于指示怎么生成.o
obj中:
下面我们从顶层开始慢慢分析:
*******温馨提示:下面的注释是为了方便处理,写在每一条语句后面,其实这样的风格是不好的,所以,如果
你使用了这个makefile,请将注释换行...或者去掉,否则可能编译异常!谢谢记住!
*******
最外层的makefile:
- SHELL = /bin/sh # 这个地方是指示使用的shell是sh
- EXEC = ir_tree # 最终生成的binary的名称
- BUILD_DIR = build # 这个子文件夹,此处也就是我们build文件夹
- all: # all在此处是终极目标,这个你应该知道的。一般我们make的时候,第一个目标作为终极目标
- @( cd ${BUILD_DIR}; make ) # 这句是进去build文件夹去执行那个makefile
- clean: # clean就不说了
- @echo 'start clean...'
- @($(RM) $(EXEC))
- @(cd ${BUILD_DIR}; make clean)
- @echo 'Finished!'
- @echo ''
现在进入build文件夹,看这个文件夹下面的makefile
- SHELL = /bin/sh # 同上
- INCLUDE_DIR := # include文件夹,一般我们在引用库的时候,需要将其头文件放在一个include中,然后自己的程序 # 编译的时候需要包含这个include,例如-I$(<span style="font-family: SimHei;">INCLUDE_DIR</span><span style="font-family: SimHei;">)</span>
- LIB_DIR := -lm # 引入的库
- EXEC = ../ir_tree # 这是一个最终binary名称,这里是将这个可执行放在了上层文件夹中
- -include obj/subdir.mk # 这个地方是include了一个子文件
- # 这里子文件作用是,为了生成所有的.o文件(当然附带生成.d文件!),生成.o之后,才能回到这一 # 层的makefile进行链接成最终的可执行的操作!具体操作我们稍后再看
- all:${EXEC} # 好!这里是这个makefile的第一个目标。即终极目标,所有需要找<span style="font-family: SimHei;">${EXEC}的生成规则!</span>
- ${EXEC}: ${OBJS} # <span style="font-family: SimHei;">${EXEC}的生成规则,注意这里我们没有看到$(OBJS),那是因为在</span><span style="font-family: SimHei;">obj/subdir.mk中!</span><span style="font-family: SimHei;">
- </span> @echo ' Building target: $@ '
- gcc -o $@ $(OBJS) $(LIB_DIR) # 这一句就是为了将所有的.o文件 + 引用的库 链接起来,生成最后的$@,也就是$(EX # EC),也就是最后的binary!
- @echo 'Finished building target: $@'
- @echo ''
- clean:
- @echo 'start rm objs and deps ...'
- $(RM) $(OBJS) \
- $(C_DEPS)
- @echo 'Finish rm objs and deps ...'
- .PHONY: all clean # 伪目标
- .SECONDARY:
下面需要看看obj中的subdir.mk的内容了!这个是为了生成所有的.o文件。
同时!请注意:当我们的一个.c或者.h被修改之后,需要重新编译!这一点非常重要!
特别是.h被修改的时候,不能忘记重新编译( 当然,有些时候.h修改,我们不需要编译,这个先暂时不说,后面在讨论!其实,你使用一个make --touch就可以~ )
- C_SRCS += \ # 所有的.c文件,当然你喜欢使用wildcard也是可的!
- ../src/card.c \ # $(<span style="font-family: SimHei;">wildcard ../src/*.c</span><span style="font-family: SimHei;">)</span>
- ../src/index.c \
- ../src/node.c \
- ../src/rect.c \
- ../src/split_l.c \
- ../src/test.c
- OBJS += \ <span style="font-family: SimHei;"># 所有的.c文件,当然你喜欢使用wildcard也是可的!</span>
- ./obj/card.o \ # OBJS = $(patsubst %.c,%.o,$(wildcard ../src/*.c))
- ./obj/index.o \ # 但是你要将src文件目录改成obj的 <span style="font-family: SimHei;">OBJS := $(addprefix "./obj/",$(notdir $(OBJS)))</span>
- ./obj/node.o \
- ./obj/rect.o \
- ./obj/split_l.o \
- ./obj/test.o
- C_DEPS += \ # deps
- ./obj/card.d \
- ./obj/index.d \
- ./obj/node.d \
- ./obj/rect.d \
- ./obj/split_l.d \
- ./obj/test.d
- all: $(OBJS) # 注意在这个subdir中,这个是终极目标,也就是所有的objs
- obj/%.o: ../src/%.c ./obj/%.d #这里是o文件的依赖规则:注意是.c和.d同时成为依赖,.d文件中是一个目标的所有的依赖文 # 件,包括.c和.h文件,所有一旦.h被修改,这个地方也是可以识别的!
- @echo 'start building $< ...'
- gcc -O3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" \
- -MT"$(@:%.o=%.d)" -o "$@" "$<"
- @echo 'Finished building: $< '
- @echo ''
- -include $(C_DEPS) # 注意:这里将所有的.d文件引入!注意,第一次引入时候,没有.d文件,会寻找.d的生成规则,也就是下面 # 的,这个.d又是依赖.c文件的,所有,一旦一个.c文件中多了一个头文件之类,又可以跟新.d,从而,执行 # 上面的.o生成时候,就能够实时跟新
- ./obj/%.d: ../src/%.c # 注意:这里为了生成.d
- @echo 'start building $(notdir $@)...'
- $(CC) $< $(INCLUDE) -MM -MD -o $@
好了,上面所有的都分析完了,然后可以make一下,.、ir_tree 看看效果吧~
如果你要下载这个工程,我已经上传了,你可以免费下载:ir_tree
from:http://blog.csdn.net/shanshanpt/article/details/17198413
Makefile 实际用例分析(一) ------- 比较通用的一种架构的更多相关文章
- Makefile 实际用例分析(二) ------- 比较通用的一种架构
之前已经讲了这一篇文章:Makefile实际用例分析(一)-----比较通用的一种架构 现在这篇其实和那个差的不是很多,只是在布局上有些差别(这个makefile也是论坛上一起讨论过的,囧,忘了哪个论 ...
- Makefile 实际用例分析(三) ------- 是用GUN automake 处理自己的工程
前面两篇已经说过了自己怎么去为一个工程写makefile: 第一篇 第二篇 现在这一篇说的是怎么使用GNU的工具去写一个符合开源标准的Makefile呢! 首先我觉你应该参考: Automake Au ...
- Psp个人软件开发软件需求分析和用例分析
Psp个人软件开发软件需求分析和用例分析 一.需求分析 1.业务需求 1.1 应用背景 开发项目进度计划总是那么不明确,延期经常出现,甚至无法给出一个相对比较明确的延迟时间.这样给市场的推广会带来很大 ...
- K米APP----案例分析
K米APP----案例分析 第一部分 调研,评测 第一次上手体验 软件的美工做得不错,功能排版很清楚,用户很容易上手,不至于用户不知道怎么用这个APP点歌 软件最主要的功能是KTV的点歌功能,这个功能 ...
- Psp个人软件开发软件需求分析及用例分析
一.需求分析 1. 业务需求 1.1 应用背景 开发项目进度计划总是那么不明确,延期经常出现,甚至无法给出一个相对比较明确的延迟时间.这样给市场的推广会带来很大的影响,不确定因素使得应对十分困难. ...
- [转][LoadRunner]LR性能测试结果样例分析
LR性能测试结果样例分析 测试结果分析 LoadRunner性能测试结果分析是个复杂的过程,通常可以从结果摘要.并发数.平均事务响应时间.每秒点击数.业务成功率.系统资源.网页细分图.Web服务器资源 ...
- 需求用例分析之五:业务用例之Rational系
版权声明:作者:张克强.未经作者允许不得转载. https://blog.csdn.net/zhangmike/article/details/28134897 作者:张克强 作者微博:张克强- ...
- [LoadRunner]LR性能测试结果样例分析
R性能测试结果样例分析 测试结果分析 LoadRunner性能测试结果分析是个复杂的过程,通常可以从结果摘要.并发数.平均事务响应时间.每秒点击数.业务成功率.系统资源.网页细分图.Web服务器资源. ...
- LoadRunner性能测试样例分析
LR性能测试结果样例分析 测试结果分析 LoadRunner性能测试结果分析是个复杂的过程,通常可以从结果摘要.并发数.平均事务响应时间.每秒点击数.业务成功率.系统资源.网页细分图.Web服务器资源 ...
随机推荐
- Description Resource Path Location Type Missing artifact com.********:framework:jar:1.0.2 pom.xml /项目名 line **** Maven Dependency Problem
问题具体描述如下图所示: 对于该问题本人是这么解决的. 在window下[Preferences]目录找到[Maven]下的[usersetting] 查看local repository 里面的路径 ...
- react 返回上一页
import * as React from 'react' import { Layout } from 'antd'; import creatHistory from 'history/crea ...
- UVA - 1619 Feel Good(扫描法)
题目: 思路: 预处理出a[i]在哪个范围区间内是最小的,然后直接遍历a数组求答案就可以了. 这个预处理的技巧巧妙的用了之前的处理结果.(大佬tql) 代码: #include <bits/st ...
- CentOS 6 Yum本地源配置
#cd /etc/yum.repos.d #rm CentOS-Base.repo CentOS-Base.repo 是yum 网络源的配置文件(默认) #vi CentOS-Media.repo C ...
- CentOS7 安装 PHP7.2
点击查看原文 安装源 安装 EPEL 软件包: $ sudo yum install epel-release 安装 remi 源: $ sudo yum install http://rpms.re ...
- ndk编译libpcap 1.7.4
android完全菜鸟,绝对的第一次接触,想做手机抓包,在网上搜又是NDK 又是JNI 又是JNETPCAP 完全蒙了,让我这种android和java都弄不明白什么关系的人情何以堪! 静下心想一想, ...
- 洛谷 3178 [HAOI2015]树上操作
[题解] 就是个树链剖分的模板题. #include<cstdio> #include<algorithm> #include<cstring> #define L ...
- Codeforces Educational Codeforces Round 17 Problem.A kth-divisor (暴力+stl)
You are given two integers n and k. Find k-th smallest divisor of n, or report that it doesn't exist ...
- 【Codeforces 567D】One-Dimensional Battle Ships
[链接] 我是链接,点我呀:) [题意] 长度为n的一个序列,其中有一些部分可能是空的,一些部分是长度为a的物品的一部分 (总共有k个长度为a的物品,一个放在位置i长度为a的物品会占据i,i+1,.. ...
- cocos2d 接 android sdk 的一个小坑 关于armbeabi 和 armbeabi-v7a
cocos2d 接 android sdk 的时候,有些sdk会要求外链到某个工程中,而这个工程的lib文件夹里会包含armbeabi 和 armbeabi-v7a这两个文件夹,如果直接打包会闪退.只 ...