Makefile文件的编写
文章目录
- 前言
- 第一个最简单的 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文件的编写相关推荐
- Linux平台Makefile文件的编写基础篇和GCC参数详解
问:gcc中的-I.是什么意思....看到了有的是gcc -I. -I/usr/xxxxx..那个-I.是什么意思呢 最佳答案 答:-Ixxx 的意思是除了默认的头文件搜索路径(比如/usr/incl ...
- CUDA、MPI和SU混编,MakeFile文件的编写
本人研究地震勘探的全波形反演,最近在用CUDA+MPI加速反演过程. 写代码过程中最关键的是Makefile文件的编写,也是最难的.下面给出基于SU(Seismic Unix)的CUDA+MPI开发过 ...
- Makefile文件的编写(实例详解)
1.什么是Makefile? 一个工程中的源文件不计其数,其按类型.功能.模块分别放在若干个目录中,Makefile定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译 ...
- Makefile文件的编写规则
欢迎大家关注笔者,你的关注是我持续更博的最大动力 Makefile文件编写规则 文章目录: 1 makefile文件介绍 2 makefile文件编写 1 makefile文件介绍 makefile是 ...
- Makefile 文件的编写
学习前的准备 需要准备的工程目录结构如下: . ├── add │ ├── add_float.c │ ├── add.h │ └── add_int.c ├── main.c └── sub├── ...
- Linux系统中编译大型C语言项目必备技能之:Makefile文件的编写
文章目录 Makefile的介绍 Makefile的编写规范--简单举例 Makefile的编写规范--复杂举例 项目描述 编译需求 编译思路 Makefile的介绍 我们在阅读一些大型的C语言项目时 ...
- Linux下makefile文件的编写
在学习如何编写makefile文件之前,我们首先需要了解什么是makefile文件: makefile描述了整个工程的编译和链接等规则.它指明了哪些文件需要先编译,哪写文件需要后编译,哪些文件需要重新 ...
- Linux编程——入门级Makefile文件编写
前言 1.在Linux开发环境中,编写Makefile文件是一个必须的技能,虽然现在有好多IDE可以自动生成所需要的Makefile文件,但有时能看懂Makefile文件也是更好的了解项目的编译过程. ...
- 基础知识(三)makefile文件编写初级篇
linux下进行c++开发,需要熟悉相关编译器的编译.链接命令.这边主要以实例讲解,如何在linux中,进行c++程序简单的编译链接运行. 一.单文件编译链接 这里先从最简单的单个文件编译链接为例.在 ...
最新文章
- oracle打散分组函数,oracle分组函数
- 轻量级DAO层实践初体验
- OGEngine_粒子效果
- Scala是完全面向函数式的编程语言体现点
- LIBGDX游戏引擎平台介绍与搭建
- 英语期末复习unit 1-2课后习题第一题及背诵段落
- 《精通Spring 4.x 企业应用开发实战》学习笔记
- 复杂版---JS获得某天是一年当中的第几天
- 如何创建一个Mybatis程序,实现对数据库的简单查询?
- java synchronized 类锁_【java】synchronized对象锁和类锁简介【图文教程】
- python相关函数_Python 函数相关概念
- apache的虚拟目录配置
- 关于近日番茄花园洪磊被拘之事的一些个人看法
- 深度强化学习训练调参方法
- 319. 灯泡开关【我亦无他唯手熟尔】
- 路由器芯片和服务器,软路由就是软路由,还是回归它本该有的身份吧。一个越折腾越迷茫者的经历...
- 中学计算机社团活动计划,社团活动方案
- JavaScript实现手机拍摄图片的旋转、压缩
- CMD快捷指令之启动字符映射表
- SwipeRefreshLayout极其简单的下拉刷新工具
热门文章
- 1.VHDL的基础知识
- linux设置开机自启动(开机启动项)(chkconfig)
- Latex中ACM-Reference-Format顺序与论文引用顺序不一致solution
- 入侵检测钻石模型和基于网络的威胁复制
- Scikit-learn Quick Start
- 李宏毅机器学习笔记(十六)——无监督学习(四):自编码器
- 新零售系统mysql设计(产品spu 商品sku)表 二次修改
- 数学建模(2)-Matlab绘制爱心
- 打造属于自己的字体(转)
- 微信小程序下拉框刷新