【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酷企秀可视化设计器中的创新应用

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

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

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

Mysql基础篇(一)Mysql概述

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

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

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

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

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

Python运维之多线程!!

一、多线程 二、多线程编程之threading模块 2.1、使用threading进行多线程操作有两种方法: 三、多线程同步之Lock(互斥锁) 四、多线程同步之Semaphore(信号量) 五、多线程同步之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.基本…

OS复习笔记ch5-3

引言 上一节我们学习了关于信号量机制的一些内容&#xff0c;包括信号量的含义&#xff0c;对应的PV操作等。 如图所示&#xff0c;上一节主要是针对信号量的互斥&#xff0c;其实信号量机制还可以做很多事情&#xff0c;比如实现进程同步和前驱关系&#xff0c;这一节我们先复…

【Spring】JdbcTemplate

JdbcTemplate 是 Spring 提供的一个 JDBC 模板类&#xff0c;是对 JDBC 的封装&#xff0c;简化 JDBC 代码 也可以让 Spring 集成其它的 ORM 框架&#xff0c;例如&#xff1a;MyBatis、Hibernate 等 使用 JdbcTemplate 完成增删改查 一、环境准备 数据库&#xff1a; 准备…

Marin说PCB之如何快速打印输出整板的丝印位号图?

当小编我辛辛苦苦加班加点的把手上的板子做到投板评审状态的时候&#xff0c;坐在我旁边的日本同事龟田小郎君说让我把板子上的丝印也要调一下&#xff0c;我当时就急了&#xff0c;这么大的板子&#xff0c;将近1W多PIN 了都&#xff0c;光调丝印都要老半天啊&#xff0c;而且…

Docx文件误删除如何恢复?别再花冤枉钱了,4个高效恢复软件!

不管是工作还是学习&#xff0c;总是会与各种各样的文件打交道。文件量越多就越容易出现文件丢失、文件误删的情况。遇到这些情况&#xff0c;失去的文件还能找回来吗&#xff1f;只要掌握了一些数据恢复方法&#xff0c;是很有机会恢复回来的&#xff0c;下面我会将这些方法分…

[机器学习系列]深入探索回归决策树:从参数选择到模型可视化

目录 一、回归决策树的参数 二、准备数据 三、构建回归决策树 (一)拟合模型 (二)预测数据 (三)查看特征重要性 (四)查看模型拟合效果 (五) 可视化回归决策树真实值和预测值 (六)可视化决策树并保存 部分结果如下&#xff1a; 一、回归决策树的参数 DecisionTreeRegress…

NVIDIA_SMI has failed because it couldn’t communicate with the NVIDIA driver

参考&#xff1a;https://www.zhihu.com/question/474222642/answer/3127013936 https://blog.csdn.net/ZhouDevin/article/details/128265656 nvidia-smi查看报错&#xff0c;nvcc正常 1&#xff09;查看nvidia版本 ls /usr/src | grep nvidia nvidia-550.78 2&#xff09;…