【Linux】项目自动化构建工具make/makefile的简单使用

使用步骤

1) 编写

  1. 创建 makefile 文件
vim makefile
用 vim 打开名为 makefile 的文件,存在该文件则打开编辑,不存在则创建并打开.
  1. 在 makefile 文件中编写需要编译的文件
test:test.cppg++ -o test test.cpp
第一行:
冒号左侧为编译后的可执行文件名,可以随便取.
冒号右侧为依赖关系列表,写上编译可执行文件需要的源文件即可, 如果依赖多个源文件用空格隔开即可, 不需要加上头文件,因为头文件会在包含了其的头文件内展开.第二行(开头一定要加一个 tab, 语法规则):
编译的 .C 文件就用 gcc, .cpp 文件就用 g++, -o 后面接编译生成的可执行文件的名称,和冒号左边保持一致,最后加上依赖文件,就平常编
译文件怎么写,这里就怎么写.这里第二行的 test 可以用 $@ 代替,表示 : 左边是什么,这里就是什么, test.cpp 依赖文件这里可以用 $^ 代替,表示 : 右侧的依赖文件
列表是什么,这里就是什么,在依赖文件列表存在多个依赖文件时,可以大大提高编写效率.

3.编写清理操作

clean:rm -rf test
第一行:
删除不需要依赖任何文件, 直接写 clean: 就行, 冒号左边也可以自定义名称, 建议就写 clean, 顾名思义挺好的.第二行(开头一定要加一个 tab, 语法规则):
简单的一个删除指令,上一步生成的可执行文件叫啥就删啥,注意只删除可执行文件,别把源文件也删除了!
  1. .PHONY
.PHONY:clean
clean:rm -rf test
.PHONY: 后面加上自定义的名称, 注意与第二行的名称保持一致,表示始终可以执行该指令.

5.简单完整makefile代码

test:test.cppg++ -o test test.cpp
.PHONY:clean
clean:rm -rf test

2) 使用

编写好 makefile 后, 输入指令 make 即可开始编译, 编译成功后会生成自定义名称的可执行文件.
在这里插入图片描述
如图, make 之后会自动执行依赖方法生成可执行文件, 需要清理可执行文件输入 make clean 即可.
在这里插入图片描述
make clean 可以始终执行, 即:
在这里插入图片描述
但是 make 不行, 编译成功一次后, 再 make 的话会出现如下情况:
在这里插入图片描述
它会提示 ‘test’ 是最新的, 这是为了防止重复编译, 因为如果在一个大项目中, 编译一次是很慢的, 如果目前的可执行文件是最新的, 就没有必要再编译一次了, 如何判断可执行文件是最新的呢? 很简单, 比较源文件的最后修改时间和生成的可执行文件的最后修改时间即可, 如果可执行文件的最后修改时间大于源文件的最后修改时间, 那么此时生成的可执行文件一定是最新的, 那么就禁止重新编译, 而如果此时的源文件的最后修改时间大于可执行文件的最后修改时间, 表示源文件有修改, 此时就允许再次编译.
在这里插入图片描述
随便修改一下源文件, 此时就可以再次编译了.
在这里插入图片描述
如果不想通过修改源文件来使能够再次编译, 也可以通过 touch 指令来使能够再次编译.
在这里插入图片描述
如果文件不存在, 那么 touch 就是用来创建一个文件, 如果一个文件已经存在, 那么再 touch 就是将该文件的 Access, Modify, Change 时间都变为最新的.

除此之外还可以通过设置 .PHONY 来让编译始终可以执行, 在 makefile 文件中加上:

.PHONY:test //加上这一句                                                                                                                                                                                                                       
test:test.cppg++ -o test test.cpp
.PHONY:clean
clean:rm -rf test

此时就可以无视时间, 无限 make 了.
在这里插入图片描述

补充

为什么清理要写 make clean, 要加上 clean, 而编译直接就写 make 就好不用加上后缀呢?
其实也没什么特别的, 就是 makefile 规定谁在前就默认执行谁, 如果把清理写在前面, 那么直接输入 make 就会执行清理操作, 而编译就需要写为 make xxxx.

makefile 中这么写:

.PHONY:clean
clean:rm -rf test
test:test.cppg++ -o $@ $^ 

执行就是这样的:
在这里插入图片描述
此时直接输入 make 就是清理操作了, 而编译需要加上可执行文件名.

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

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

相关文章

封装一个可以最小化和展开的弹窗组件

gl-dialog 大概思路: 在弹窗组件内部引入gl-dialog-collapse,这个组件主要用于存储已经被最小化的弹窗(基础数据) 弹窗内部的数据如何在父组件拿到是通过作用域插槽来实现的 gl-dialog接收一个tempData这个数据会在内部被记录下来…

salmon使用体验

文章目录 salmon转录本定量brief模式一:fastq作为输入文件需要特别注意得地方 模式二: bam文件作为输入 salmon转录本定量 brief 第一点是,通常说的转录组分析其中有一项是转录本定量,这是一个很trick的说话,说成定量…

代码随想录算法训练营第四十二天| 01背包问题(二维、一维)、416.分割等和子集

系列文章目录 目录 系列文章目录动态规划:01背包理论基础①二维数组②一维数组(滚动数组) 416. 分割等和子集①回溯法(超时)②动态规划(01背包)未剪枝版剪枝版 动态规划:01背包理论基…

基于Vue3与ElementUI Plus酷企秀可视化设计器中的创新应用

一、引言 随着科技的快速发展,前端技术已经从简单的网页呈现进化到了复杂的数据可视化、互动体验和跨平台应用的构建。酷企秀可视化设计器作为一个集成了多种前端技术的创新平台,不仅为企业提供了全方位的数字化展示解决方案,还在多个行业领…

Java实现NFS文件上传、下载和读取功能的工具类

Java实现NFS文件上传、下载和读取功能的工具类 引言:代码示例一、准备工作二、工具类设计与核心方法三、异常处理与性能优化四、总结 引言: NFS(Network File System)广泛应用于分布式环境的情况下,这里介绍使用Java工…

SRC上分秘诀+实战挖掘+挖洞技巧+新手上路+详细讲解

SRC马上到来 可能有些好兄弟们还没有头绪 只会做一些靶场 并没有什么实战经验 所以这篇文章给大家分享一下我挖洞2个月的经验分享 适合新手上路 如何找站? 谷歌搜索 谷歌搜索 谷歌搜索 SQL注入XSS所有漏洞 inurl:.php?idxx 公司inurl:.asp?idxx 公司inurl:.jsp?…

【考研数学】强化《660》和《880》先做哪个?

880和660一般在强化阶段做 这两本习题各自的特点是: 660题是专门训练客观题的,难度较大,对于基础知识点的考察比较深入,如果你的基础不好,去做660题很有可能被打击到,这个时候不要担心,很正常&a…

「AIGC」Agent AI智能体的未来:技术、伦理与经济的交汇点

Agent AI智能体,作为人工智能领域的前沿技术,正逐渐渗透到社会的各个层面。随着技术的不断进步,Agent AI智能体在提高效率、促进创新、甚至重塑社会结构方面展现出巨大潜力。然而,这也带来了一系列挑战,包括技术发展、…

cf240-B-Mashmokh and ACM DP

https://codeforces.com/contest/414/problem/B 题意: 在[1,n]范围内 构造出一个长度为k的数组 使得a[i1]%a[i]0 求出数组的个数%1e97 思考: 在一开始,会去想这是一道数学题,似乎得出某个式子便可以得出结果,因此就开始一个一个的去构造尝试,当构造了几个样例后,也许会发现…

Mysql基础篇(一)Mysql概述

目录 基本概念 数据库(DataBase,DB) 数据库的定义 数据库的分类 数据库管理系统(DataBase Management System,DBMS) SQL(Structured Query Language) Mysql Mysql数据模型 下载安装Mysql 基本概念 数据库(DataBase,DB) 数据库的定义 按照数据结构来组织、存储和管理数…

Springboot整合Minio,2024版教程

Springboot整合Minio,2024版教程 介绍安装方式代码pomymlconfigMinioService 推荐文章 介绍 CSDN里面找资料真的是垃圾堆里刨食吃。优质作者和内容非常少,最近还出现了评论下方打广告的,粉丝上w,文章内容质量主打一个抄袭&#xf…

java报错:使用mybatis plus查询一个只返回一条数据的sql,却报错返回了1000多条

今天遇到一个问题 系统线上问题,经常出现这样的问题,刚重启系统时不报错了,可是运行一段时间又会出现。sql已经写了limit 1,mybatis的debug日志也返回total为1,可是却报错返回了1805条数据 乍一看,感觉太不…

《21天学通C++》(第十四章) 宏和模板介绍(2)

相较于宏&#xff0c;C更推荐使用模板编程&#xff0c;因为它们提供了更好的类型安全、更清晰的语法和更易于调试的代码 1.模板函数 语法 template <typename T> void function(T param) {// 函数体&#xff0c;使用T作为类型参数 }例子 #include <iostream> us…

汽车之家,如何在“以旧换新”浪潮中大展拳脚?

北京车展刚刚落幕&#xff0c;两重利好正主导汽车市场持续升温&#xff1a;新能源渗透率首破50%&#xff0c;以及以旧换新详细政策进入落地期。 图源&#xff1a;中国政府网 在政策的有力指引下&#xff0c;汽车产业链的各个环节正经历着一场深刻的“连锁反应”。在以旧换新的…

Python运维之多线程!!

一、多线程 二、多线程编程之threading模块 2.1、使用threading进行多线程操作有两种方法&#xff1a; 三、多线程同步之Lock&#xff08;互斥锁&#xff09; 四、多线程同步之Semaphore&#xff08;信号量&#xff09; 五、多线程同步之Condition 六、多线程同步之Event…

CSS和JavaScript

CSS 在html中引入CSS 我们需要先在该项目先建立css文件 html引入CSS,在<head></head>中添加<link>标签 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" co…

mac 本地使用docker 运行es,kibana

1.下载 m芯片一些版本不支持.踩过坑.翻看官网才知道只有部分镜像支持m芯片 https://hub.docker.com/添加链接描述 docker pull elasticsearch:7.17.21 docker pull kibana:7.17.21镜像已经下载下来了 2.创建文件映射-挂载 /Users/lin/dev/dockerMsg 其中lin是自己的用户名…

关于线程池,它的扩展问题你知道吗?(自己总结)

专门想一下为什么线程池不用Excutors&#xff0c;之前的印象是错的&#xff0c;居然还拿来面试里讲&#xff0c;惭愧&#xff0c;这里暂时整理俩小问题&#xff0c;其他的后续可能会更新。。 线程池是创建的越大越好嘛 #线程池创建的越大越好吗 Tip&#xff1a;2024-04-10 更…

本地搭建hydra服务用go以验证oidc流程

目录 1、docker搭建hydra&#xff0c;环境配置&#xff1a; 2、搭建完成后服务调用&#xff1a; 2.1保证服务正常启动&#xff1a; 2.2 通过postman调用&#xff0c;获取client_id&#xff1a; 2.3 通过client_id&#xff0c;实现oauth2/auth调用 3. 通过go语言实现oidc验…

【qt】容器的用法

容器目录 一.QVertor1.应用场景2.增加数据3.删除数据4.修改数据5.查询数据6.是否包含7.数据个数8.交换数据9.移动数据10.嵌套使用 二.QList1.应用场景2.QStringList 三.QLinkedList1.应用场景2.特殊点3.用迭代器来变量 四.QStack1.应用场景2.基本用法 五.QQueue1.应用场景2.基本…