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

使用步骤

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.mfbz.cn/a/604791.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue2项目升级到vue3经历分享4

后端重构,如果接口做好抽象封装,只需要考虑jar之间的兼容性问题,jdk版本不变,基本不用做太大的调整,但是前端就不一样,除了vue框架本身,css的调整,改起来更是让人头疼。前面写了vue2…

Linux与windows网络管理

文章目录 一、TCP/IP1.1、TCP/IP概念TCP/IP是什么TCP/IP的作用TCP/IP的特点TCP/IP的工作原理 1.2、TCP/IP网络发展史1.3、OSI网络模型1.4、TCP/IP网络模型1.5、linux中配置网络网络配置文件位置DNS配置文件主机名配置文件常用网络查看命令 1.6、windows中配置网络CMD中网络常用…

C++进阶之路:深入理解编程范式,从面向过程到面向对象(类与对象_上篇)

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

Mysql 基础 - 常见 子句

算数运算符 > < > < !/<> 逻辑运算符 3i in is null is not null 2l limit like 2o or 、order by 1a and ib between and 1n not and、or 、not、 in、 orderby、 limit、 like、 between...and、 is null 、is not null

我独自升级崛起怎么下载 游戏下载教程分享

《我独自升级&#xff1a;崛起》这款游戏核心聚焦于激烈的战斗与角色的持续成长。新加入的玩家首要任务是熟悉基础攻击模式&#xff0c;随后深入探索技能组合策略与连贯招式的艺术&#xff0c;同时掌握防守与躲避技巧&#xff0c;这些都是战斗中不可或缺的关键。随着战斗的持续…

那个在买珠宝的年轻人

金价搭上过山车&#xff0c;今年以来价格一路飙涨。 珍珠身价同步飙升&#xff0c;晋级珠宝圈“新宠”。 文玩圈“减龄”&#xff0c;盘珠串不再只是“老头乐”。 月薪3000的年轻人&#xff0c;悄悄实现“宝石”自由。 黄金珠宝走俏&#xff0c;这届年轻人到底有着怎样的珠宝…

Baidu Comate智能编码助手 -----AI编程帮你解放双手

目录 Baidu Comate是什么&#xff1f; Baidu Comate如何安装&#xff1f; 在VSCode上安装Baidu Comate插件 Baidu Comate如何使用&#xff0c;有哪些功能&#xff1f; 1.代码解释 2.代码注释 使用感受 如何体验 Baidu Comate是什么&#xff1f; Baidu Comate智能编码助手…

网络编程入门之UDP编程

欢迎各位帅哥美女来捧场&#xff0c;本文是介绍UDP网络编程。在这里&#xff0c;你会见到最详细的教程&#xff1b;细致到每一行代码&#xff0c;每一个api的由来和使用它的目的等。 目录 1.UDP相关API 1.1.两个类 1.2.两个类中的方法 2.UDP编程 2.1.大体框架 2.2.内容构…

修改el-checkbox样式

一定要在最外层&#xff1b; //未选中框/deep/ .el-checkbox__inner{border-color: #0862a3;}//选中框/deep/ .el-checkbox__input.is-checked .el-checkbox__inner{background-color: #0862a3;border-color: #0862a3;}//未选中框时右侧文字/deep/ .el-checkbox__label{}//选中…

企业做网站,如何设计才有创意?

企业做网站&#xff0c;如何设计才有创意&#xff1f;我们都希望能打造一个有创意的网站建设&#xff0c;能在众多网站中脱颖而出&#xff0c;能够营销推广公司的产品&#xff0c;为公司带来更多的经济效益收益。广州网站建设的时候&#xff0c;记住直观的设计可以让用户体验更…

Terrain —— Nodes

目录 Convert HeightField —— 转化高度场 HeightField —— 为地形创建初始高度场或遮罩场 HeightField Blur —— 模糊高度场或遮罩场 HeightField Clip —— 限制高度场的值 HeightField Combine Layers —— 将多个volume或VDB合并为一个新的volume或VDB HeightFiel…

C++浮点数format时的舍入问题

C浮点数format时的舍入问题 首先有这样一段代码&#xff1a; #include <iostream> #include <stdio.h> using namespace std;int main() {cout << " main begin : " << endl;printf("%.0f \r\n", 1.5);printf("%.0f \r\n&…

2024副业指南:年轻人热捧的七大赚钱副业,在家就能做!做得好的月入过万了

副业&#xff0c;听起来就像是在主业之外的“小打小闹”&#xff0c;但你知道吗&#xff1f;很多人通过副业实现了财务自由&#xff0c;甚至有的人副业收入超过了主业&#xff01; 今天&#xff0c;就让我们一起探索那些适合你的副业机会&#xff0c;让你在工作之余也能成为收入…

3D模型素材有哪些常见的用途?

3D模型素材已经成为了设计、游戏开发、电影制作和建筑等领域的重要工具。它们以其独特的形式和丰富的细节&#xff0c;为这些领域的专业人士提供了无尽的创作可能性。 1.建筑和室内设计&#xff1a;在建筑设计中&#xff0c;3D模型可以帮助建筑师更直观地展示设计方案&#xff…

oracle试用期过期,解决办法

过期重置方法&#xff0c;删除注册表&#xff0c;相当于无限试用&#xff0c;缺点每30天都要重置一次 1. window r 输入 regedit 确定&#xff0c;打开注册表 2.删除下图里的两个文件夹 3.重启 plsql,登录成功

二叉树的前序、中序、后序遍历的C++实现

二叉树的前序、中序、后序 遍历属于深度优先搜索方式&#xff0c;本文使用递归法实现前序、中序、后序的遍历方法&#xff0c;代码如下&#xff1a; #include <iostream> #include <vector>struct TreeNode{int val;TreeNode* left;TreeNode* right;TreeNode(int …

Windows基于WSL2安装Kali-linux

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、kali-linux是什么&#xff1f;二、简单使用1.下载2.打开1.通过应用列表2.通过Terminal 三、安装图形界面1.下载2.打开 四、重头戏总结 前言 kali-linux大家…

NERF++:Analyzing and Improving Neural Radiance Fields神经辐射场的分析与改进

ABSTRACT 神经辐射场(NeRF)可以实现各种捕获设置的令人印象深刻的视图合成结果&#xff0c;包括360度捕获有界场景和前向捕获有界和无界场景。NeRF 将代表视图不变不透明度和视图相关颜色体积的多层感知器(MLPs)匹配到一组训练图像中&#xff0c;并基于立体渲染技术对新视图进…

力扣刷题--数组--第三天

今天再做两道二分查找的题目&#xff0c;关于二分查找的知识可看我前两篇博客。话不多说&#xff0c;直接开干&#xff01; 题目1&#xff1a;69.x 的平方根 题目详情&#xff1a;   给你一个非负整数 x &#xff0c;计算并返回 x 的 算术平方根 。由于返回类型是整数&#…

从零开始的软件测试学习之旅(九)jmeter直连数据库及jmeter断言,关联

jmeter直连数据库及断言,关联 jmeter直连数据库步骤jmeter断言jmeter逻辑控制器if控制器ForEach控制器循环控制器 Jmeter关联Jmeter关联XPath提取器Jmeter关联正则表达式提取器二者比较跨线程组关联 每日复习 jmeter直连数据库 概念 这不叫直连:Jmeter -> java/python 提供的…
最新文章