Make/Makefile详解

news2024/11/16 7:31:45

文章目录

  • make/Makefile
    • make
    • Makefile
    • 时间

make/Makefile

Linux项目自动化构建工具。
  • makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至进行更复杂的功能。
  • makefile带来的好处就是:自动化编译,一旦写好,只需要执行make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
  • make是一个命令工具,是一个解释makefile中指令的命令工具。
  • make是一条命令,makefile是一个文件。

make

系统中提供的一个命令
  • which make

Makefile

当前目录下创建的一个文件,这个文件保存的是对应的依赖关系和依赖方法
  • 文件名:makefile / Makefile

构建项目

mybin:mytest.c                 //表明依赖关系
	gcc -o mybin mytest.c      //依赖方法
  • 输入make执行构建项目

依赖关系
我为什么要帮你?

  • ”爸,我是你儿子!“

依赖方法
具体如何去帮你。

  • ”爸,我是你儿子,我没钱了!“;
目标文件 : 依赖文件列表(源文件)
[table]	依赖方法

清理项目

clean:                   //
	rm -f mybin          //
  • 输入 make clean执行清理项目

  • make和makefile在形成目标文件的时候,默认是从上到下扫描makefile文件的,默认形成/执行第一个目标文件。

  • 默认只形成一个。

  • 在不修改依赖文件的时候,连续多次make,只构建一次项目。

  • make和makefile怎么知道可执行程序是最新的呢?

    • 这个是通过对比时间比出来的,只要可执行程序的最近的修改时间比所有源文件的最近修改时间都要新。就说明这个可执行程序是最新的。
    • 源文件和可执行程序的最近修改时间基本上是不可能相同的。
  • 如果同时存在多个源文件,通过链接之后生成了一个可执行文件,然后出现了问题或者需要修改这多个源文件中的一两个,源文件没有全部修改,此时再进行编译链接,编译器可能只重新编译了几个进行修改的源文件然后再与老文件进行链接生成了新的可执行程序。也可能出现偏激的情况,因为源文件的个数过多,修改一个两个,编译器没有发现这两个文件被修改了,所有没有进行重新编译链接,此时的可执行程序还是老版本。

  • makefile中注释使用#

.PHONY:mybin
mybin:test.c
	gcc -o mybin test.c
clean:
	rm -f mybin
  • .PHONY:mybin:将mybin目标文件进行修饰,修饰为一个伪目标,一旦被修饰为伪目标,则修饰的目标文件的依赖方法总是被执行。

  • 通常建议将clean修饰为伪目标

mybin:test.c
	gcc -o mybin test.c

.PHONY:clean
clean:
	rm -f mybin

变量

  • $@:$@代表目标文件
  • $^:$^代表依赖文件列表
  • cc=gcc
  • flag=-o
  • bin=mybin
  • src=test.c
cc=gcc
flag=-o
bin=mybin
src=mybin

$(bin):$(src)
	$(cc) $(flag) $@ $^

.PHONY:clean
clean:
	rm -f $(bin)

make/makefile语法推导过程

mybin:test.o
	gcc -o mybin test.o
test.o:test.s
	gcc -c -o test.o test.s
test.s:test.i
	gcc -S -o test.s test.i
test.i:test.c
	gcc -E -o test.i test.c

.PHONY:clean
clean:
	rm -f mybin test.o test.s test.i
正向推导依赖关系,逆向执行依赖方法

时间

  • stat filenam

  • Access:最近访问时间

  • Modify:内容修改时间

  • Change:属性修改时间

  • 内容修改时间变化的时候,通常属性修改时间联动改变。

  • access不是每次访问都更新,而是根据操作系统设置的策略进行更新,可能是达到一定的访问次数才更新。

  • touch test.c
    对文件的acm时间进行更新

小技巧
先把makefile写通,再写项目代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1612334.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

神经网络中的神经元和激活函数介绍

文章目录 1、什么是人工神经网络 2、什么是神经元 3、什么是激活函数 线性激活函数 Sigmoid激活函数 双曲正切激活函数 修正线性单元(ReLU)激活函数 Leaky ReLU激活函数 Softmax激活函数 1、什么是人工神经网络 神经网络能够利用多层神经元学习复杂的模…

回顾发展史,WEB组态终于可以搭建业务系统了!

一、WEB组态融合了传统工业组态和现代数据大屏 组态软件在工业控制领域有着二三十年的历史,比较知名的国内有组态王、国外有MCGS/WinCC等,用来搭建上位机监控画面,通常配合PLC使用,通过配置的方式,不需要编码&#xf…

线性表的链式存储(双向循环链表)

文章目录 前言一、双向循环链表是什么?二、双向循环链表的意义三、双向循环链表的操作实现总结 前言 T_T此专栏用于记录数据结构及算法的(痛苦)学习历程,便于日后复习(这种事情不要啊)。所用教材为《数据结…

micro-app的css样式隔离

手写微前端micro-app-CSS隔离 子应用的CSS可能会对基座应用或者其他子应用产生的影响 首先现在我们把react页面放入到vue2的页面大家也能看到一些问题了,在react中的index.css中对body的一些css样式,已经影响了基座应用的css。 为了看的更明显&#x…

【Linux】git

大家好,我是苏貝,本篇博客带大家了解Linux的编译器-gcc/g,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 目录 1.安装git2.在gitee上创建仓库3.首次配置4.下载仓库到本地5.三板斧6.git log7.gi…

STL::string简单介绍

目录 1、什么是STL STL6大组件:仿函数、算法、容器、空间配置器、迭代器、配接器 推荐文档(必须学会看文档) 2、string常用接口 a、初始化 1、什么是STL 标准模板库 STL(Standard Template Library),主要是数据结构…

【C++程序员的自我修炼】初识模板

云收天彩色 木叶落秋声 目录 函数模板 函数模板的实现 函数模板的实例化 模板参数的匹配原则 参数模板推不出来的情况 类模板 类模板的定义格式 类模板的实例化 契子 ✨ 我们在学 C语言 的时候应该都写过交换两个数的函数 swap 吧 当时我们只是写了 int 类型,那…

sherpa + ncnn 离线语音识别

目录结构 前言音视频格式转为wavsherpa-ncnn编译LinuxWindowswindows编译中遇到的问题问题“nmake -? failed with: no such file or directory”编译失败原因 成功编译截图 可执行程序说明模型下载语言识别测试LinuxWindows 参考文献 前言 小编需要实现离线音视频语言部分识…

#STM32F407VET6(天空星)标准库和HAL驱动ILI9341

一、驱动方式:软件SPI,屏幕像素320*240 二、标准库含触摸,HAL库不含触摸 三、立创参考的文档 【立创天空星ST32F407VET6】模块移植手册 - 飞书云文档 (feishu.cn)https://lceda001.feishu.cn/wiki/MFNpw4STVi5ImikkcH1clWrlnqb 四、引脚分…

ElasticSearch中使用向量和关键词联合检索

注:案例测试数据及其索引构建详见:ElasticSearch中使用bge-large-zh-v1.5进行向量检索(一)-CSDN博客 中的第三部分。 假设任务场景为:用“新疆”向量检索相关的数据,同时需要匹配关键词“巴州”。 首先获取…

C#到底属于编译型语言还是解释型语言?

C#是一种编译型语言,也称为静态类型语言,这意味着C#代码在运行之前需要经过编译器的编译处理,并生成一个可执行的本地代码文件(通常是.exe或.dll文件)。相反,解释型语言将代码转换为低级代码后直接执行&…

【结构型模式】装饰器模式

​一、装饰器模式概述 装饰器模式(装饰者模式)定义:装饰器模式动态地将责任附加到对象上。若要拓展功能,装饰者提供了比继承更有弹性地替代方案。(对象结构型模型)通俗点来说:动态的给一个对象增…

12.事件参数

事件参数 事件参数可以获取event对象和通过事件传递数据 获取event对象 <template><button click"addCount">Add</button><p>Count is: {{ count }}</p> </template> <script> export default {data() {return {count:0…

13.Hexo Plugins插件及将网站上传到互联网

Plugins 有些想要实现的操作Hexo实现不了&#xff0c;这时就可以使用插件 插件一般都是可以下载的代码片段&#xff0c;可以附加到Hexo上 添加了一些功能或一些额外的东西 Plugins | Hexo 在官方页面&#xff0c;有471个插件&#xff0c;并附加了一些描述 点击一个插件时&…

【研发管理】产品经理知识体系-文化、团队与领导力

导读&#xff1a;文化、团队与领导力是产品经理知识体系中的重要组成部分。产品经理需要深入理解并应用这些要素&#xff0c;以推动产品的成功开发和运营。通过塑造积极的文化氛围、建立高效的团队和发挥领导力&#xff0c;产品经理能够为公司创造更大的价值。 目录 概述 1、…

(1)认识人工智能

第一章 认识人工智能 引言 本人目前大三&#xff0c;双非一本的人工智能专业&#xff0c;代码能力不算太差&#xff0c;做过项目&#xff0c;也打了比赛&#xff0c;获了奖&#xff0c;但是走技术路线总会有否定自己的感觉&#xff0c;可能是感觉自己的才能没有在搞技术方面实…

#QT获取ONENET云平台数据(草稿)

1.基本目标 &#xff08;1&#xff09;查询ONENT云平台的数据 &#xff08;2&#xff09;查询网络时间 &#xff08;3&#xff09;网络音乐拉取&#xff08;作为背景音乐&#xff09;&#xff0c;音量可调 2.制作UI界面 &#xff08;1&#xff09;串口图标的制作方法 &…

RIME-SVM,基于RIME寒冰优化算法优化SVM支持向量机回归预测 (多输入单输出)-附代码

支持向量机&#xff08;SVM&#xff09; 支持向量机&#xff08;SVM&#xff09;是一种广泛用于分类和回归的强大监督学习算法。在回归任务中&#xff0c;特别是在SVM被用作支持向量回归&#xff08;SVR&#xff09;时&#xff0c;目标是找到一个函数&#xff0c;这个函数在给…

PMP证书难考吗?

PMP证书难不难考要看你学的咋样的&#xff0c;我的PMP认证就是一个多月拿下的&#xff0c;同一个考次的同学在考试前的讲师直播过程中一直在说冲刺题难怎么怎么滴&#xff0c;最后还是通过率98%&#xff0c;绝大多数都通过了&#xff0c;并且还有47%的同学考了3A&#xff0c;这…

Vue2slot插槽(理解与应用)

1、插槽的概念 插槽&#xff08;Slot)是vue为组件的封装者提供的能力。允许开发者在封装组件时&#xff0c;把不确定的、希望由用户指定的部分定义为插槽。 举个例子&#xff1a;组件好比小霸王游戏机&#xff0c;插槽就是游戏机的插口&#xff0c;看用户插什么卡&#xff0c;就…