文章目录

  • 前言
  • 第一个最简单的 Makefile 文件举例
  • 第二个Makefile示例
  • 第三个Makefile示例
  • 第四个Makefile示例
  • 第五个Makefile示例
  • 总结

前言

Makefile文件的编写规则及内容

第一个最简单的 Makefile 文件举例

test: main.c sub.c sub.hgcc -o test main.c sub.c sub.h

如上述代码所示,生成的可执行文件(目标)test依赖于三个文件,分别是main.c、sub.c、sub.h ,这是第一行代码的含义。第二行代码(开头要敲Tab键)的含义就是,执行这句编译代码。

Makefile文件通过判断三个依赖是否有改动,用来判断第二行编译代码是否要重新运行一次。判断依赖是否有改动主要是对文件的时间和当前目标test的生成时间做对比。

缺点:这种Makefile文件的编写缺点就是“牵一发而动全身”,比如我们修改了其中的任一项.c依赖文件,那么都会导致 gcc 这句代码的执行,导致其他没有被修改的依赖文件再次重新被编译,这就导致了执行效率很低。

注意:-o 表示链接的意思。

第二个Makefile示例

针对于上面提到的缺点,我们可以将目标test的生成进行细分。一个可执行文件的生成,首先是将.c文件编译成可链接的.o文件,然后最后将.o文件进行链接,生成可执行程序。所以Makefile文件也可以这么写(分开编译,统一链接):

代码如下(示例):

test : main.o sub.ogcc -o test main.o sub.omain.o : main.cgcc -c -o main.o main.csub.o : sub.cgcc -c -o sub.o sub.cclean :rm *.o -f

注意: gcc -c 表示只编译,不链接。

第三个Makefile示例

如果我们的依赖文件有很多,总不能每个依赖文件都单独去写各自对应生成的链接文件吧。
所以最好有个公式类比统一一下。
代码如下(示例):

test : main.o sub.ogcc -o test main.o sub.o%.o : %.cgcc -c -o $@ $<clean:rm *.o -f

注意:gcc -c -o $@ $< 表示第一个依赖,
gcc -c -o $@ $^ 表示所有依赖;
$@ 表示目标, $^ / $<表示依赖。

第三个Makefile示例是第二个Makefile示例的简略版,采用固定的规则;但是这两个有一个共同的缺点,就是无法体现出头文件.h的关系/作用。

第四个Makefile示例

针对于第二、三示例中出现的问题,如果一旦某个.c依赖文件依赖于某个头文件,则Makefile文件修改如下:
代码如下(示例):

test : main.o sub.ogcc -o test main.o sub.o%.o : %.cgcc -c -o $@ $<sub.o : sub.hclean:rm *.o -f

仅仅手工加入一句 sub.o : sub.h 表明sub.o这个链接文件依赖于sub.h文件,即可。但是我们总不能去查每一个.c依赖文件去判断包含了哪些头文件,然后手工添加,这并不是程序员的风格。

第五个Makefile示例

代码如下(示例):

objs := main.o sub.otest : $(objs)gcc -o test $^
#判断依赖文件是否存在
dep_files := $(foreach f, $(objs), .$(f).d)
dep_files := (wildcard,$(dep_files))#如果存在,将依赖文件包含进来
ifneq($(dep_files),)include $(dep_files)
endif
%.o : %.cgcc -Wp,-MD, .$@.d -c -o $@ $<
clean:rm *.o -f
disclean:
rm $(dep_files) *.o -f

缺点:不支持子目录下的某个文件!

总结

后期将会书写一个通用的Makefile文件模板供大家参考,今天先写到这里,时间紧促,如有错误欢迎指出,谢谢大家!

Makefile文件的编写相关推荐

  1. Linux平台Makefile文件的编写基础篇和GCC参数详解

    问:gcc中的-I.是什么意思....看到了有的是gcc -I. -I/usr/xxxxx..那个-I.是什么意思呢 最佳答案 答:-Ixxx 的意思是除了默认的头文件搜索路径(比如/usr/incl ...

  2. CUDA、MPI和SU混编,MakeFile文件的编写

    本人研究地震勘探的全波形反演,最近在用CUDA+MPI加速反演过程. 写代码过程中最关键的是Makefile文件的编写,也是最难的.下面给出基于SU(Seismic Unix)的CUDA+MPI开发过 ...

  3. Makefile文件的编写(实例详解)

    1.什么是Makefile? 一个工程中的源文件不计其数,其按类型.功能.模块分别放在若干个目录中,Makefile定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译 ...

  4. Makefile文件的编写规则

    欢迎大家关注笔者,你的关注是我持续更博的最大动力 Makefile文件编写规则 文章目录: 1 makefile文件介绍 2 makefile文件编写 1 makefile文件介绍 makefile是 ...

  5. Makefile 文件的编写

    学习前的准备 需要准备的工程目录结构如下: . ├── add │ ├── add_float.c │ ├── add.h │ └── add_int.c ├── main.c └── sub├── ...

  6. Linux系统中编译大型C语言项目必备技能之:Makefile文件的编写

    文章目录 Makefile的介绍 Makefile的编写规范--简单举例 Makefile的编写规范--复杂举例 项目描述 编译需求 编译思路 Makefile的介绍 我们在阅读一些大型的C语言项目时 ...

  7. Linux下makefile文件的编写

    在学习如何编写makefile文件之前,我们首先需要了解什么是makefile文件: makefile描述了整个工程的编译和链接等规则.它指明了哪些文件需要先编译,哪写文件需要后编译,哪些文件需要重新 ...

  8. Linux编程——入门级Makefile文件编写

    前言 1.在Linux开发环境中,编写Makefile文件是一个必须的技能,虽然现在有好多IDE可以自动生成所需要的Makefile文件,但有时能看懂Makefile文件也是更好的了解项目的编译过程. ...

  9. 基础知识(三)makefile文件编写初级篇

    linux下进行c++开发,需要熟悉相关编译器的编译.链接命令.这边主要以实例讲解,如何在linux中,进行c++程序简单的编译链接运行. 一.单文件编译链接 这里先从最简单的单个文件编译链接为例.在 ...

最新文章

  1. oracle打散分组函数,oracle分组函数
  2. 轻量级DAO层实践初体验
  3. OGEngine_粒子效果
  4. Scala是完全面向函数式的编程语言体现点
  5. LIBGDX游戏引擎平台介绍与搭建
  6. 英语期末复习unit 1-2课后习题第一题及背诵段落
  7. 《精通Spring 4.x 企业应用开发实战》学习笔记
  8. 复杂版---JS获得某天是一年当中的第几天
  9. 如何创建一个Mybatis程序,实现对数据库的简单查询?
  10. java synchronized 类锁_【java】synchronized对象锁和类锁简介【图文教程】
  11. python相关函数_Python 函数相关概念
  12. apache的虚拟目录配置
  13. 关于近日番茄花园洪磊被拘之事的一些个人看法
  14. 深度强化学习训练调参方法
  15. 319. 灯泡开关【我亦无他唯手熟尔】
  16. 路由器芯片和服务器,软路由就是软路由,还是回归它本该有的身份吧。一个越折腾越迷茫者的经历...
  17. 中学计算机社团活动计划,社团活动方案
  18. JavaScript实现手机拍摄图片的旋转、压缩
  19. CMD快捷指令之启动字符映射表
  20. SwipeRefreshLayout极其简单的下拉刷新工具

热门文章

  1. 1.VHDL的基础知识
  2. linux设置开机自启动(开机启动项)(chkconfig)
  3. Latex中ACM-Reference-Format顺序与论文引用顺序不一致solution
  4. 入侵检测钻石模型和基于网络的威胁复制
  5. Scikit-learn Quick Start
  6. 李宏毅机器学习笔记(十六)——无监督学习(四):自编码器
  7. 新零售系统mysql设计(产品spu 商品sku)表 二次修改
  8. 数学建模(2)-Matlab绘制爱心
  9. 打造属于自己的字体(转)
  10. 微信小程序下拉框刷新