当前位置: 首页 > news >正文

【Linux课程学习】make/Makefile:Linux项目自动化构建工具

🎁个人主页:我们的五年

🔍系列专栏:Linux课程学习 

🌷追光的人,终会万丈光芒

🎉欢迎大家点赞👍评论📝收藏⭐文章

🍉一.make/Makefile的理解:

写成Makefilemakefile都是可以的。

先来看看百度百科的解释:

1.Linux 环境下的程序员如果不会使用GNU make来构建和管理自己的工程,应该不能算是一个合格的专业程序员,至少不能称得上是 Unix程序员。

2.整个工程的编译只需要一个命令就可以完成编译、连接以至于最后的执行。极大提高了效率

所以对于程序员来说,make/Makefile是很重要的。


本人的理解:

让我来解释一下就是,我们在项目中会生成很多目标文件,而且会生成很多次。如果我们不用make/Makefile,每次我们都要写依赖关系(需要的源文件,也就是要用哪个文件生成去生成新的文件),还有依赖方法(具体通过什么方法生成)。

如果我们在Makefile文件中(Makefile和makefile都可以,m可大写可小写),写好了 依赖关系和依赖方法,我们只需要写make+目标文件,就会直接生成我们需要的目标文件。如果只写make,目标文件省略,那么会生成第一个目标文件,也就是makefile文件最开始的文件。

🍉二.makefile文件的构成:

make是一条命令,makefile是一个程序。两者构成了可执行程序。

1.目标文件(target file)。

2.依赖文件(Dependent file)。

●目标文件和依赖文件构成了依赖关系 。

●目标文件在前,依赖文件在后,中间有:

写好这一套以后,我们直接保存退出 ,然后在命令行输入make test,就会根据依赖关系和依赖方法生成test文件。

发生错误时,make会直接退出。make会进行报错。

注:在依赖方法前面加上@,在使用make的时候,可以不让依赖方法回显。

例如:

makefile文件如下:

🥦不加@,就会回显依赖方法:

🥦加上@,就不会回显依赖方法。

🍉三 .更加规范便捷的用法写makefile文件:

🥥makefile文件中注释语句:

在语句前面加上#就可以注释语句

🥥首先是变量的使用:

变量的定义方法:

新名字=原文件的名字

例如:

target=test

depend=test.cpp

将上面的改完就是:

使用变量时,要使用$,可以理解为C语言的解引用。之后依赖文件和目标文件发生变动的时候,只需要在变量定义的时候改就可以了,这样比较方便。

🥥$@和$^的使用:

$@:表示所有的目标文件。

$^:表示所有的依赖文件。

如果有很多依赖文件时,我们就可以使用这个。这样在依赖方法中就不要写那么多的文件。

如下:

$@代表test

$^代表test.cpp

🍉四.对于伪文件和时间戳的理解:

伪文件:

🌽用途:

伪文件不会真正生成一个文件,伪目标文件一般用于对文件清理,安装,测试等用途。 

🌽定义方法:

.PHONY:文件名称

这样就可以定义一个伪文件。


时间戳:

🌽查看文件的时间戳 :

stat   文件名称

可以查看文件的时间戳。

每个文件都会有时间戳这个属性,一切皆文件。

依赖文件和目标文件也会有时间戳。

make有一个特点,如果目标文件的时间戳比依赖文件新,就是时间在依赖文件后面,就不会新生产目标文件,而是提示up  to data

这样的情况下,test的时间在test.cpp后面,就不会执行依赖方法。

相反伪文件不会生成真的文件,所以不会出现这种情况,可以一直执行make。

例如 :

只是到后面不会做什么事情而已。

🍉小测试:

我们可以用touch -m 指令更新时间戳,来判断是不是真的是根据时间戳来判断是否新生成目标文件。

从上面的例子我们就可以看出,在我们更新时间以后,又重新执行了g++ -o test test.cpp

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 英语六级-学习
  • redis单点、主从、哨兵、集群的不同
  • WPF DataGrid 赋值与修改
  • 生活小助手系统小程序的设计
  • 灵当CRM系统index.php存在SQL注入漏洞
  • sicp每日一题[2.20]
  • MySQL基础基础篇 - SQL
  • 数据结构:内部排序
  • spark 面试题
  • Linux 防火墙:iptables (二)
  • JVM 一个对象是否已经死亡?
  • ubuntu64位系统无法运行32位程序的解决办法
  • 前后端分离,使用MOCK进行数据模拟开发,让前端攻城师独立于后端进行开发
  • 【HTTP】构造HTTP请求和状态码
  • 大数据新视界 --大数据大厂之AI 与大数据的融合:开创智能未来的新篇章
  • docker-consul
  • es的写入过程
  • gf框架之分页模块(五) - 自定义分页
  • Hibernate【inverse和cascade属性】知识要点
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • nfs客户端进程变D,延伸linux的lock
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • vue.js框架原理浅析
  • vue的全局变量和全局拦截请求器
  • 开源SQL-on-Hadoop系统一览
  • 思否第一天
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 阿里云重庆大学大数据训练营落地分享
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • ###STL(标准模板库)
  • #WEB前端(HTML属性)
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (力扣)1314.矩阵区域和
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (转)EOS中账户、钱包和密钥的关系
  • (转)母版页和相对路径
  • *上位机的定义
  • .Net 基于.Net8开发的一个Asp.Net Core Webapi小型易用框架
  • /etc/fstab 只读无法修改的解决办法
  • [ C++ ] STL---string类的使用指南
  • [ MSF使用实例 ] 利用永恒之蓝(MS17-010)漏洞导致windows靶机蓝屏并获取靶机权限
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解
  • [\u4e00-\u9fa5] //匹配中文字符
  • [04]Web前端进阶—JS伪数组
  • [Android 数据通信] android cmwap接入点
  • [BJDCTF2020]EzPHP1
  • [CLickhouse] 学习小计
  • [Flex] PopUpButton系列 —— 控制弹出菜单的透明度、可用、可选择状态
  • [iOS]iOS获取设备信息经常用法
  • [Java基础] Java中List.remove报错UnsupportedOperationException
  • [LeetCode] 178. 分数排名