Makefile实际用例分析_第1页
Makefile实际用例分析_第2页
Makefile实际用例分析_第3页
Makefile实际用例分析_第4页
Makefile实际用例分析_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Makefile 实际用例分析(一) 比较通用的一种架构这里不再说 Makefile 的基本知识, 如果需要学习, 那么 请参考: 下载: makefile 中文手册 或者点击打开链接或者跟我一起写 Makefile( 陈皓 )这里说的是一般的实际的一个 工程应该怎么去写。环境: ubuntu 10.04 先看看我的文件的分布情况: 顶层:然后 src 中:是所有的源程序以及头文件 ( 我这里是 使用自己的 IR 树的代码作为实验 )而 build 文件夹是为了 编译使用的! 下面有: obj 文件夹里面放的是编译过程中的 .o 和 .d 文件,还有一个 subdir.mk 的子文件, 用于指

2、示怎么生成 .o obj 中:下面我们从顶层开始慢慢分析: * 温馨提示:下 面的注释是为了方便处理,写在每一条语句后面,其实这样 的风格是不好的,所以,如果你使用了这个 makefile ,请将注释换行 . 或者去掉, 否则可能编译异常!谢谢记住!* 最外层的 makefile :plain view plaincopyprint?SHELL = /bin/sh# 这个地方是指示使用的 shell 是 sh EXEC = ir_tree# 最终生成的 binary 的名称 BUILD_DIR = build# 这个子文件夹,此处也就是我们 build 文件夹 all:# all 在此处是终极

3、目标, 这个你应该知道的。 一般我们 make的时候,第一个目标作为终极目标 ( cd$BUILD_DIR; make )# 这句是进去 build 文件夹去执行那个 makefileclean:# clean 就不说了echo start clean.($(RM) $(EXEC)(cd $BUILD_DIR; makeclean) echo Finished! echo 现在进入 build 文件夹,看这个文件夹下面的 makefileplain view plaincopyprint?SHELL = /bin/sh#同上 INCLUDE_DIR := # include 文件夹, 一般我们

4、在引用库的时候, 需要将其头文件放在一个 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 # 这个地方是 includ

5、e 了一个子文件 # 这 里子文件作用是,为了生成所有的 .o 文件 (当然附带生成 .d 文件! ),生成 .o 之后,才能回到这一# 层的 makefile 进行链接成最终的可执行的操作! 具体操作 我们稍后再看 all:$EXEC # 好!这里 是这个 makefile 的第一个目标。即终极目标,所有需要找 <span style=font-family: SimHei;>$EXEC的生成规则! </span> $EXEC: $OBJS # <span style=font-family: SimHei;>$EXEC的生成规则,注意这里我们没有看到 $

6、(OBJS) ,那是因为在</span><span style=font-family:SimHei;>obj/subdir.mk 中! </span><span</span> echo style=font-family: SimHei;>Building target: $ gcc -o $ $(OBJS) $(LIB_DIR)# 这一句就是为了将所有的 .o 文件+ 引用的库 链接起来,生成最后的 $ ,也就是 $(EX# EC) ,也就是最后的 binary !echo Finishedbuilding target: $ec

7、ho clean:$(RM) $(OBJS) echo start rm objs and deps .$(C_DEPS)echo Finish rm objs anddeps .PHONY: all clean伪目标 .SECONDARY:下面需要看看 obj 中的 subdir.mk 的内容了 !这个是为了生成 所有的 .o 文件。同时!请注意:当我们的一个.c或者.h被修改之后,需要重 新编译!这一点非常重要!特别是 .h 被修改的时候,不能忘记重新编译 ( 当然,有些时 候.h修改,我们不需要编译,这个先暂时不说,后面在讨论! 其实,你使用一个 make -touch 就可以 )pla

8、in view plaincopyprint?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=fo

9、nt-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/sp

10、lit_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 中,这个是终极 目标,也就是所有的 objsobj/%.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 生成时候,就能够实时跟新

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论