makefile很久就接触过了,但是一直没怎么深入的去学习和总结;在项目中我也只是看看makefile或者修改部分语句,全部自己动手写的话还真没有;知识在于沉淀,这句说的非常好,所以现在把自己理解的东西,记录下来,以便后面查阅;

这篇blog要分享的是在单目录下多文件的makefile编写,首先说明当前目录下有多少文件:fun.h   fun.c  main.c  makefile;其中*.c 文件都要依赖 *.h文件;

首先常规编译:

预处理期:gcc  -E  -o fun.i  fun.c

编译阶段:gcc  -S  -o fun.s fun.i

汇编阶段: gcc  -c  -o fun.o fun.s

链接阶段:gcc   -o main  fun.o  main.o

这就是gcc的各个编译阶段(头文件在当前目录下,会直接搜索到),下面用makefile来编译下;

第一版的makefile:

  1. CC = gcc
  2. CFLAGS = -g -Wall
  3. objects = main.o fun.o
  4. main:main.o fun.o
  5. $(CC) -o main main.o fun.o
  6. main.o:main.c
  7. $(CC) $(CFLAGS) -c main.c -o main.o
  8. fun.o:fun.c
  9. $(CC)  $(CFLAGS) -c fun.c -o fun.o
  10. clean:
  11. rm -rf $(objects) main

上面第一版就是根据gcc命令行凑成的,第二版将会使用makefile的自动推导功能;

比如:fun.o:fun.c

$(CC)  $(CFLAGS) -c fun.c -o fun.o

当已知目的文件为 fun.o时,makefile会自动推导出依赖文件为fun.c并且编译规则也会自动推导,所以只需要注明依赖的头文件就可以;可以利用makefile自动推导特点简化为:fun.o:fun.h就可以了;

第二版makefile

  1. CC = gcc
  2. CFLAGS = -g -Wall
  3. objects = main.o fun.o
  4. main:$(objects)
  5. $(CC) -o main $(objects)
  6. main.o:fun.h
  7. fun.o:fun.h
  8. clean:
  9. rm -rf $(objects) main

其实上面的makefile已经写的非常简洁了,如果还需要简单的话可以再简化些:

  1. CC = gcc
  2. CFLAGS = -g -Wall
  3. objects = main.o fun.o
  4. main:$(objects)
  5. #$(objects):fun.h  //可以有,也可以没有
  6. PHONY:clean
  7. clean:
  8. rm -rf $(objects) main

其中.PHONY是用来说明后面的名称不是一个文件,主要用来区分同名文件(如果有一个文件名为clean文件,那么clean:下的规则就会无效);

转载请注明作者和原文出处,原文地址:http://blog.csdn.net/yuzhihui_no1/article/details/44808441

若有不正确之处,望大家指正,共同学习!谢谢!!!

单目录下多文件 makefile编写的更多相关文章

  1. 多目录下多文件 makefile编写

    前面已经分享了单目录项下多文件的makefile的编写,现在来看看多目录下多文件makefile的编写: 在做项目时,一般文件都会分几个目录来存放:基本的是  include/  bin/ src/ ...

  2. Linux下使用shell实现上传linux下某个目录下所有文件到ftp

    首先我们需要搞清楚单个文件怎么上传,把这个单文件上传到ftp上的实现命名为一个:upload_to_ftp_command.sh 之后,需要弄清楚怎么实现遍历一个目录下的所有文件的,把这个遍历某个目录 ...

  3. java利用WatchService实时监控某个目录下的文件变化并按行解析(注:附源代码)

    首先说下需求:通过ftp上传约定格式的文件到服务器指定目录下,应用程序能实时监控该目录下文件变化,如果上传的文件格式符合要求,将将按照每一行读取解析再写入到数据库,解析完之后再将文件改名. 一. 一开 ...

  4. .net core 读取本地指定目录下的文件

    项目需求 asp.net core 读取log目录下的.log文件,.log文件的内容如下: xxx.log ------------------------------------------beg ...

  5. linux下编译qt5.6.0静态库(使用./configure --help来看看都有哪些参数。超详细,有每一个模块的说明。如果改变了安装的目录,需要到安装目录下的bin目录下创建文件qt.conf)(乌合之众)good

    linux下编译qt5.6.0静态库 linux下编译qt5.6.0静态库 configure生成makefile 安装选项 Configure选项 第三方库: 附加选项: QNX/Blackberr ...

  6. Eclipse下无法自动编译,或者WEB-INF/classes目录下没文件,编译失败的解决办法(转载)

    文章来源:http://www.cnblogs.com/xfiver/archive/2010/07/07/1772764.html 1.  IOException parsing XML docum ...

  7. PHP 获取指定目录下所有文件(包含子目录)

    PHP 获取指定目录下所有文件(包含子目录) //glob — 寻找与模式匹配的文件路径 $filter_dir = array('CVS', 'templates_c', 'log', 'img', ...

  8. Python遍历目录下所有文件的最后一行进行判断若错误及时邮件报警-案例

    遍历目录下所有文件的最后一行进行判断若错误及时邮件报警-案例: #-*- encoding: utf-8 -*- __author__ = 'liudong' import linecache,sys ...

  9. ftp下载目录下所有文件及文件夹内(递归)

    ftp下载目录下所有文件及文件夹内(递归)   /// <summary> /// ftp文件上传.下载操作类 /// </summary> public class FTPH ...

随机推荐

  1. Linux企业级项目实践之网络爬虫(13)——处理user-agent

    User Agent即用户代理,是Http协议中的一部分,属于头域的组成部分,User Agent也简称UA.它是一个特殊字符串头,是一种向访问网站提供你所使用的浏览器类型及版本.操作系统及版本.浏览 ...

  2. redis 学习笔记一

    找了半天,发觉还是redis的源码看起来比较舒服.所以决定今年把redis的源码读一遍顺便做个读书笔记.好好记录下.话说现在越来不越不愿意用脑袋来记录东西,喜欢靠note来记.话说这样不爱用脑会不会过 ...

  3. Ajax--json(Ajax调用返回json封装代码、格式及注意事项)

    Ajax调用json封装代码<dbda.php>: //Ajax调用返回JSON public function JsonQuery($sql,$type=1,$db="mydb ...

  4. C# - List操作- 去掉重复

    ChangeList里面会有重复的数据,这时可以这样去掉重复的item // Remove duplicated info var dup = ChangeList.Where(item => ...

  5. 有关JAVA基础学习中的集合讨论

        很高兴能在这里认识大家,我也是刚刚接触后端开发的学习者,相信很多朋友在学习中都会遇到很多头疼的问题,希望我们都能够把问题分享出来,把自己的学习思路整理出来,我们一起探讨一起成长.    今天我 ...

  6. Counting Squares_hdu_1264(矩阵).java

    Counting Squares Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  7. 有关android 应用的plugin框架调研

    1. 借助android提供的shareduserid属性使多个不同的apt共用一个userid,以扫除权限壁垒,获取插件context,继而获取view并加载插件.这种方式是建立在已经安装完成的ap ...

  8. Oracle数据库的创建与验证

    创建数据库,输入命令dbca创建数据库 会弹出创建数据库相应的对话框 单击下一步 选择创建一个数据库,并单击下一步 数据库模板选择一般目的的转换过程即可.单击下一步 全局数据库名称和SID名称,要和上 ...

  9. 监控工具nagios

    Nagios 简介是一个开源软件,可以监控网络设备网络流量.Linux/windows主机状态,甚至可以监控打印机它可以运行在Linux上或windows上基于浏览器的web界面方便运维人员查看监控项 ...

  10. compass模块

    Compass核心模块Reset :重置CSS模块 @import "compass/reset" Layout :页面布局的控制能力 @import "compass/ ...