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

news2024/11/14 18:55:40

使用步骤

1) 编写

  1. 创建 makefile 文件
vim makefile
用 vim 打开名为 makefile 的文件,存在该文件则打开编辑,不存在则创建并打开.
  1. 在 makefile 文件中编写需要编译的文件
test:test.cpp
	g++ -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.cpp
	g++ -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.cpp
	g++ -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.cpp
	g++ -o $@ $^ 

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

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

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

相关文章

【C++庖丁解牛】C++11---lambda表达式 | 包装器

🍁你好,我是 RO-BERRY 📗 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 目录 1. lambda表达式1.1 C98中…

「C++ 内存管理篇 00」指针

目录 一、变量,变量名和指针 1. 什么是变量? 2. 变量名和指针 3. 使用指针获取数据 二、指针变量和数组变量 三、编译器对指针的等级有着严格的检查 四、指针的加减 1. 存放指针的变量的加减 2. 存放指针的变量的自增自减 3. 两个指针相减 一、变量&…

【前端】-【防止接口重复请求】

文章目录 需求实现方案方案一方案二方案三 需求 对整个的项目都做一下接口防止重复请求的处理 实现方案 方案一 思路:通过使用axios拦截器,在请求拦截器中开启全屏Loading,然后在响应拦截器中将Loading关闭。 代码: 问题&…

CD-PAN复合纳米纤维膜

CD-PAN复合纳米纤维膜可能是通过某种特定的方法,如溶剂热反应或水热反应等,将CdS纳米颗粒与PAN(聚丙烯腈)纳米纤维结合起来的复合材料。 这种复合纳米纤维膜可能会继承CdS的光电性质和PAN纳米纤维的机械性能,从而在某些…

Golang | Leetcode Golang题解之第61题旋转链表

题目: 题解: func rotateRight(head *ListNode, k int) *ListNode {if k 0 || head nil || head.Next nil {return head}n : 1iter : headfor iter.Next ! nil {iter iter.Nextn}add : n - k%nif add n {return head}iter.Next headfor add > …

R语言4版本安装mvstats(纯新手)

首先下载mvstats.R文件 下载mvstats.R文件点此链接:https://download.csdn.net/download/m0_62110645/89251535 第一种方法 找到mvstats.R的文件安装位置(R语言的工作路径) getwd() 将mvstats.R保存到工作路径 在R中输入命令 source(&qu…

Day27:阻塞队列、Kafka入门、发送系统通知、显示系统

阻塞队列BlockingQueue BlockingQueue 解决线程通信的问题。阻塞方法:put、take。 生产者消费者模式 生产者:产生数据的线程。消费者:使用数据的线程。 (Thread1生产者,Thread2消费者) 实现类 ArrayBlockingQueueLinkedBlockingQueuePr…

软件工程专业就业方向及前景分析

软件工程专业作为一门应用广泛且持续发展的学科,其就业方向多样,就业前景十分乐观,以下是上大学网(www.sdaxue.com)整理的软件工程专业一些主要的就业方向及该领域的总体前景分析,供大家参考! 就业方向&…

一文理解前端如何调用后端(java)方法

阅读完文章大约需要3~5分钟 文章目录 一、什么是后端方法路径?二、ajax、axios调用后端方法总结 一、什么是后端方法路径? 这里针对的是 java 后端项目中在 controller 文件夹中的类文件,这类文件的后缀一般都会带有 controller&#xff0c…

如何远程访问连接管理器?

远程访问连接管理器是一种方便的工具,可以实现远程访问计算机和网络设备的功能。它使用户能够从任何地点连接到远程计算机,并进行文件传输、桌面共享和远程控制等操作。远程访问连接管理器不仅提供了便利性,还能提高工作效率,并为…

【Vue 2.x】学习vue之二组件

文章目录 Vue二组件第五章es6文件导入出1、导出export 组件(component)1、定义2、模块化与组件化3、组件的分类1、非单文件组件非单文件三步骤创建组件标准写法简化写法组件的嵌套非单文件的不足之处 2、单文件组件vue单文件组件的使用脚手架创建项目重点…

(学习日记)2024.05.09:UCOSIII第六十三节:常用的结构体(os.h文件)第二部分

之前的章节都是针对某个或某些知识点进行的专项讲解,重点在功能和代码解释。 回到最初开始学μC/OS-III系统时,当时就定下了一个目标,不仅要读懂,还要读透,改造成更适合中国宝宝体质的使用方式。在学完野火的教程后&a…

【JavaEE】线程的概念

文章目录 1、什么是线程2、进程和线程的区别3、多线程的概述4、在Java中实现多线程的方法1.继承Thread类2.实现Runnable接口3.使用匿名内部类来继承Thread类,实现run方法4.使用匿名内部类来实现Runnable接口,实现run方法5.使用 lambda表达式 1、什么是线…

018、Python+fastapi,第一个Python项目走向第18步:ubuntu24.04 安装cuda和pytorch环境

一、说明 我们安装了pytorch环境之后,会用yolo v9 来测试一下,看8g 显存能不能跑下来,上次用无影云电脑,4cpu8g内存直接爆了,云电脑也死机了,提示一直占用内存不释放,我自己的云电脑不能占用内…

基于alpha shapes的边缘点提取(matlab)

1、原理介绍 由Edelsbrunner H提出的alpha shapes算法是一种简单、有效的快速提取边界点算法。其克服了点云边界点形状影响的缺点,可快速准确提取边界点。如下图所示,对于任意形状的平面点云,若一个半径为a的圆,绕其进行滚动&…

类加载子系统之类的生命周期(待完善)

0、前言 文中大量图片来源于 B站 黑马程序员 0.1、类加载子系统在 JVM 中的位置 类加载器负责的事情是:加载、链接、解析 0.2、与类的生命周期相关的虚拟机参数 参数描述-XX:TraceClassLoading打印出加载且初始化的类 1、类的生命周期 堆上的变量在分配空间的时…

如何基于nginx搭建https网站

华子目录 使用nginx的http_ssl模块建立加密传输的网站查看配置文件ssl配置文件的主要参数实验:搭建nginxssl加密认证的web服务器 使用nginx的http_ssl模块建立加密传输的网站 查看 [rootserver ~]# nginx -V #查看是否有--with-http_ssl_module模块,如…

2024五一杯:煤矿深部开采冲击地压危险预测 (详细完整思路,已修改)

背景 了解即可 煤炭是中国的主要能源和重要的工业原料。然而,随着开采深度的增加,地应力增大,井下煤岩动力灾害风险越来越大,严重影响着煤矿的安全高效开采。在各类深部煤岩动力灾害事故中,冲击地压已成为威胁中国煤矿…

BigKey的危害

1.2.1、BigKey的危害 网络阻塞 对BigKey执行读请求时,少量的QPS就可能导致带宽使用率被占满,导致Redis实例,乃至所在物理机变慢 数据倾斜 BigKey所在的Redis实例内存使用率远超其他实例,无法使数据分片的内存资源达到均衡 Redis阻…

Vue---router实现路由跳转

Vue—router实现路由跳转 目录 Vue---router实现路由跳转基本使用路由跳转html实现路由跳转JS实现路由跳转 基本使用 所谓路由&#xff0c;就是将一个个组件映射到不同的路由url中 首先要将App内的内容换成router-view // App.vue <template><div id"app"…