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

Linux:make,Makefile

在这里插入图片描述
hello,各位小伙伴,本篇文章跟大家一起学习《Linux:make,Makefile》,感谢大家对我上一篇的支持,如有什么问题,还请多多指教 !
如果本篇文章对你有帮助,还请各位点点赞!!!

话不多说,开始正题:

文章目录

    • :maple_leaf:
    • :maple_leaf:总的说(理解)
    • :maple_leaf:例子
    • :maple_leaf:多个文件
      • :leaves:Makefile中的通配符`%`
      • :leaves:`$`符
      • :leaves:`make`

🍁

  • 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力
  • 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作
  • makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
  • make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
  • make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。

🍁总的说(理解)

就是依赖例子

🍁例子

先简单写一个c代码:

#include<stdio.h>int main()
{printf("hello\n");return 0;
}

再vim一个Makefile:

delete:del.cgcc -o delete del.c.PHONY:clean
clean:rm -f delete

在这里插入图片描述

也可以这么写:
在这里插入图片描述

$@ : 表示目标文件
$^ : 表示所有依赖文件

依赖关系

  • delete依赖del.c

依赖方法

  • gcc -o delete del.c,就是对应的依赖方法
  • gcc -o $@ $^,也可以是这样

Makefile本质就是依赖关系和依赖方法的集合

原理

  • make在默认方式下,也就是只输入make命令,那:
  1. make会在当前目录下找名字叫“Makefile”或“makefile”的文件。

  2. 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“delete”这个文件,并把这个文件作为最终的目标文件。

  3. 如果delete文件不存在,或是del.c所依赖的后面的文件的文件修改时间要比delete这个文件新(可以用 touch 测试),那么,他就会执行后面所定义的命令来生成del.c这个文件。

  4. 如果del.c所依赖的delete文件不存在,那么make会在当前文件中找目标为del.c文件的依赖性,如果找到则再根据那一个规则生成del.c文件。(这有点像一个堆栈的过程)
    在这里插入图片描述

  5. 当然,你的C文件和H文件是存在的啦,于是make会生成 del.c 文件,然后再用 del.c 文件声明make的终极任务,也就是执行文件delete了。

  6. 这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。

  7. 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。

  8. make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦。

  9. 只输入make会默认实行Makefile里第一句命令

项目清理

  • 工程是需要被清理的
  • 像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显示要make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重编译。
  • 但是一般我们这种clean的目标文件,我们将它设置为伪目标,用 .PHONYPHONY是假的意思)修饰,伪目标的特性是,总是被执行的。
  • 可以将我们的 delete 目标文件声明成伪目标,测试一下。

在这里插入图片描述

简单来说就是:我需要clean这个文件,但是没有,所以make会搜寻目标文件为make的文件,也就是:

clean:rm -f delete

如果要形成clean目标文件,其对应的方法总是被执行的

stat

stat delete

在这里插入图片描述

🍁多个文件

bin = delete
src = del.c$(bin):$(src)gcc -o $@ $^

在这里插入图片描述

bin(可以自己命名,定义了目标文件) = 可以跟多个文件
src(可以自己命名,定义了源文件) = 可以跟多个文件

🍃Makefile中的通配符%

例子:
%.c:所有的.c文件
%.o:所有的.o文件

tar = programsrc = $(wildcard *.c)
obj = $(src:.c=.o)%.o:%.cgcc -c $< -o $@
$(tar):$(obj)gcc -o $(tar) $(obj).PHONY:clean
clean:rm -f $(obj) $(tar)

下面是一个简单的实例操作步骤:

1.创建文件:
在一个新的目录中,创建以下文件:

main.c:

 #include <stdio.h>void hello() {printf("Hello, World!\n");}int main() {hello();return 0;}

hello.c:

 #include <stdio.h>void hello();

4.创建 Makefile:
在同一目录中创建一个名为 Makefile 的文件,内容如下:

TARGET = program
SOURCES = $(wildcard *.c)
OBJECTS = $(SOURCES:.c=.o)%.o: %.cgcc -c $< -o $@$(TARGET): $(OBJECTS)gcc -o $(TARGET) $(OBJECTS).PHONY:clean
clean:rm -f $(OBJECTS) $(TARGET)

src = $(wildcard *.c)
obj = $(src:.c=.o)

这两行用于自动生成源文件和目标文件列表。

  1. src = $(wildcard *.c):

  2. wildcard 函数用于查找当前目录下所有 .c 文件,并将它们的列表赋值给 src 变量。

  3. obj = $(src:.c=.o):

  4. 这行使用了模式替换,将 src 中的每个 .c 文件名替换为相应的 .o 文件名,生成的列表赋值给 obj 变量。

这样,就可以在编译时自动处理所有源文件,而不必手动列出每个文件。

%.o:%.c
gcc -c $< -o $@

这行规则来自动编译 .c 文件为 .o 文件:
在这里插入图片描述

命令行操作:
在命令行中输入make
编译完成后,运行生成的可执行文件:./program
如果需要清理生成的文件,可以运行:make clean

🍃$

在 Makefile 中,$ 是一个特殊符号,用于引用变量和自动变量。以下是一些常用的用法:

1.引用变量:

  • $(VAR_NAME):用于引用名为 VAR_NAME 的变量。例如,如果你定义了 SOURCES,可以使用 $(SOURCES) 来访问其值。

2.自动变量:

  • $<:表示规则中的第一个依赖文件(通常是源文件)。
  • $@:表示当前规则的目标文件(通常是生成的对象文件)。
  • $^:表示所有依赖文件的列表,去重。

示例:

%.o: %.cgcc -c $< -o $@

在这里,$< 会被替换为 .c 文件的名称,而 $@ 会被替换为相应的 .o 文件的名称。

🍃make

Makefile 的行为:

  1. 默认目标:make 从上到下扫描 Makefile,默认生成第一个目标。如果想执行其他目标,可以使用 make <target>。
  2. 语法错误处理:如果在执行命令时发生语法错误,make 会停止处理,避免生成不完整或错误的文件。
  3. 自动推导:make 会根据文件的依赖关系自动推导目标。如果依赖文件不存在,make 不会立即执行相关命令,而是会继续推导直到找到需要的依赖文件。
  4. 逆向执行:一旦找到所有依赖文件,make 会逆向执行所有相关的命令,以生成最终目标。
  5. 默认生成:make 默认生成一个可执行文件,但可以根据需要定义多个目标。

你学会了吗?
好啦,本章对于《Linux:make,Makefile》的学习就先到这里,如果有什么问题,还请指教指教,希望本篇文章能够对你有所帮助,我们下一篇见!!!

如你喜欢,点点赞就是对我的支持,感谢感谢!!!

请添加图片描述

相关文章:

Linux:make,Makefile

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习《Linux&#xff1a;make&#xff0c;Makefile》&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 如果本篇文章对你有帮助&#xff0c;还请各位点点赞&…...

基于代理的分布式身份管理方案

目的是使用分布式的联合计算分发去替换掉区块链中原有的类第三方可信中心的证书机制&#xff0c;更加去中心化。 GS-TBK Group Signatures with Time-bound Keys. CS-TBK 算法 Complete subtree With Time-bound Keys&#xff0c;该算法是用来辅助检测用户的签名是否有效&…...

VSCode开发ros程序无法智能提示的解决方法(一)

VSCode开发ros程序无法智能提示的解决方法&#xff08;一&#xff09; 问题解决 问题 在Ubuntu下使用vscode开发ros程序&#xff0c;无法进行智能提示。 解决 将 intelli Sense Engine 设置为 Tag Parser 即可。...

grep命令如何实现正则表达式搜索?

grep 命令支持使用正则表达式&#xff08;Regular Expression&#xff0c;简称 regex&#xff09;进行搜索 以下是一些使用正则表达式的基本示例&#xff1a; 搜索包含 “example” 的行&#xff1a; grep "example" file.txt搜索以 “abc” 开头的行&#xff1a; g…...

Vue报错 ‘vite‘ 不是内部或外部命令,也不是可运行的程序或批处理文件

报错 vue-project0.0.0 dev vite‘vite’ 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。解决 第1步. 控制台输入 npm install -g create-vite第2步. 控制台输入 npm install -g vite第3步. 运行就ok啦...

emqx代理订阅主题的方法

需求:需要代理订阅主题 mqtt/MaxVision/# 5.0以上的版本 界面操作添加就可以5.0以下版本 修改emqx.config 文件 首先在EMQX Dashboard(web端)中模块 emqx_mod_subscription 要启用修改配置 #1.切换目录 cd /home/emqx/etc#2.编辑配置文件 emqx.config vim emqx.config#3.修…...

页面关键路径渲染详解

关键路径渲染 浏览器不会等待全部资源都下载完后才进行渲染&#xff0c;而是采用渐进式的渲染方式&#xff0c;本文就介绍一下这种渐进式的渲染方式。 当浏览器获取到用于呈现网页的资源后&#xff0c;通常就会开始渲染网页。那么究竟是在什么时候就会开始渲染&#xff1f; …...

错题集锦之C语言

直接寻址和立即寻址 算法的又穷性是指算法程序的运行时间是有限的 未经赋值的全局变量值不确定 集成测试是为了发现概要设计的错误 自然连接要求两个关系中进行比较的是相同的属性&#xff0c;并且进行等值连接&#xff0c;在结果中还要把重复的属性列去掉 赋值运算符 赋值…...

【2024华为杯数学建模竞赛】E题 解题思路 | 视频特征提取

这高速公路应急车道紧急启用模型 问题 1解题思路解题思路 问题 2解题思路 问题 3解题思路 问题 1 某路段&#xff08;长度约5000m&#xff0c;行车道2应急车道1&#xff09;上有四个视频观测点&#xff08;见示意图1&#xff09;。请基于该路段四个视频数据解决如下问题&#x…...

ubuntu 执行定时任务crontab -e 无法输入的问题

界面显示 GNU nano 4.8 /tmp/crontab.l0A1HJ/crontab # Edit this file to introduce tasks to be run by cron. # # Each task to run has to be defined t…...

快速响应:提升前端页面加载速度技巧的必知策略方案

在本文中&#xff0c;我们将深入探讨导致页面加载缓慢的常见原因&#xff0c;并分享一系列切实可行的优化策略&#xff0c;无论你是刚入门的新手&#xff0c;还是经验丰富的开发者&#xff0c;这些技巧都将帮助你提升网页性能&#xff0c;让你的用户体验畅快无阻。 相信作为前端…...

VUE-CLI配置全局SCSS变量

一.引入node-sass和sass-loader依赖 npm install --save-dev sass-loader node-sass 二. 在项目根目录中创建一个scss变量文件&#xff0c;比如constant.scss&#xff1a; 三.在vue.config.js文件中引入这个变量文件&#xff1a; // vue.config.js module.exports {css: {l…...

前端JavaScript导出excel,并用excel分析数据,使用SheetJS导出excel

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f…...

浅谈内网攻防之道-内网系统凭证钓鱼

你荒废的今日&#xff0c;正是昨日殒身之人祈求的明日。 1、FakeLogonScreen FakeLogonScreen 是用 C# 编写的应用程序&#xff0c;可以模拟 Windows 的登录屏幕来欺骗用户输入&#xff0c;从而盗取凭证 在目标的 session 会话中&#xff0c;指定该程序&#xff1a; 该工具能…...

fmql之ubuntu联网

需求&#xff1a;fmql搭载linux&#xff0c;并且可以远程访问。 连路由器 板卡通过网线与路由器连接&#xff0c;ip设置成同段&#xff0c;可以ping通&#xff1a; 但是ping不通baidu&#xff08;如果路由器没有网/流量的话&#xff0c;就无法上网&#xff09; ZYNQ7020通过网…...

掌握AI创作神器:10分钟搞定ComfyUI和Flux大模型

前言 最近大火的Flux 1.0模型&#xff0c;大家都去体验过没&#xff1f; 此模型是由SD的前员工创立的黑森林实验室推出&#xff0c;一经推出&#xff0c;业界掀起了非常大的反响&#xff0c;相关从业人员都感叹模型可以媲美甚至赶超SD了&#xff1b;现象级的成为了现在很多AI…...

React js Router 路由 2, (把写过的几个 app 组合起来)

完整的项目&#xff0c;我已经上传了&#xff0c;资源链接. 起因&#xff0c; 目的: 每次都是新建一个 react 项目&#xff0c;有点繁琐。 刚刚学了路由&#xff0c;不如写一个 大一点的 app &#xff0c;把前面写过的几个 app, 都包含进去。 这部分感觉就像是&#xff0c; …...

Linux基础3-基础工具2(vim详解,gcc详解)

上篇文章&#xff1a;Linux基础3-基础工具1(什么是工具&#xff0c;yum&#xff0c;vim基础)-CSDN博客 本章重点&#xff1a; 1. vim详解 2. gcc详解 目录 一. vim详解 1.1 命令模式 1.2 插入模式 1.3 底行模式 二. gcc/g 2.1 程序的翻译过程&#xff08;c/c代码执行过…...

GEE教程:利用sentinel-2数据进行ndwi和ndci指数的计算和下载

目录 简介 函数 normalizedDifference(bandNames) Arguments: Returns: Image Export.image.toDrive(image, description, folder, fileNamePrefix, dimensions, region, scale, crs, crsTransform, maxPixels, shardSize, fileDimensions, skipEmptyTiles, fileFormat, …...

markdown-it:将Markdown文本转换为HTML格式,展示在页面,怎么自定义里面的a标签设置为在新标签页打开

由markdown-it将文本生成html然后渲染到页面上&#xff0c;但是现在你点击里面生成好的链接只能在本标签页打开&#xff0c;怎么将其设置为在新标签打开呢&#xff1f; 安装markdown-it npm install markdown-it 使用markdown-it const mdi new MarkdownIt({html: true,l…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

Linux中《基础IO》详细介绍

目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改&#xff0c;实现简单cat命令 输出信息到显示器&#xff0c;你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...

基于单片机的宠物屋智能系统设计与实现(论文+源码)

本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢&#xff0c;连接红外测温传感器&#xff0c;可实时精准捕捉宠物体温变化&#xff0c;以便及时发现健康异常&#xff1b;水位检测传感器时刻监测饮用水余量&#xff0c;防止宠物…...