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

Linux make与makefile 项目自动化构建工具

本文章将对make与makefile进行一些基础的讲解。

假设我们要建造一座房子,建造过程涉及很多步骤,比如打地基、砌墙、安装门窗、粉刷墙壁等。每个步骤都有先后顺序,并且有些步骤可能依赖于其他步骤的完成。比如,你必须先打好地基才能砌墙,必须先砌好墙才能安装门窗。这时候,你需要一个详细的施工流程表,告诉工人每一步该做什么,以及在什么条件下可以进行下一步。make 和 makefile 就像是这个施工流程表。

一、什么是 make 和 makefile

  • makefile​:是一个文本文件,里面包含了一系列的规则,这些规则定义了如何从源文件生成目标文件,以及各个目标文件之间的依赖关系。
  • make​:是一个构建自动化工具,它会读取 makefile 中的规则,并根据这些规则来决定哪些文件需要重新编译或构建。

二、makefile 的基本结构

一个典型的 makefile 包含以下几个部分:

  • ​目标(Target)​​:你想要生成的东西,比如一个可执行文件或一个目标文件。
  • ​依赖(Dependency)​​:生成目标所需要的文件。
  • ​命令(Command)​​:为了生成目标需要执行的命令。

一个简单的 makefile 示例:

# 目标:生成可执行文件 main
main: main.o add.o sub.ogcc main.o add.o sub.o -o main# 目标:生成 main.o
main.o: main.cgcc -c main.c# 目标:生成 add.o
add.o: add.cgcc -c add.c# 目标:生成 sub.o
sub.o: sub.cgcc -c sub.c# 清理生成的文件
clean:rm -f main main.o add.o sub.o

解释

  1. ​目标 main​:

    • ​依赖​​:main.oadd.o 和 sub.o
    • ​命令​​:gcc main.o add.o sub.o -o main。这个命令表示将 main.oadd.o 和 sub.o 链接成一个可执行文件 main
  2. ​目标 main.o​:

    • ​依赖​​:main.c
    • ​命令​​:gcc -c main.c。这个命令表示将 main.c 编译成目标文件 main.o
  3. ​目标 add.o 和 sub.o​:

    • 类似于 main.o,分别将 add.c 和 sub.c 编译成目标文件。
  4. ​目标 clean​:

    • ​命令​​:rm -f main main.o add.o sub.o。这个命令用于清理生成的可执行文件和目标文件。

三、make 的工作原理

当你运行 make 命令时,make 会读取 makefile 文件,并按照以下步骤工作:

  1. ​读取 makefile​:make 会解析 makefile 中的规则,构建一个依赖图。
  2. ​确定目标​​:默认情况下,make 会尝试生成 makefile 中第一个目标(在这个例子中是 main)。
  3. ​检查依赖​​:make 会检查目标的依赖文件是否存在,以及这些依赖文件是否有更新。如果依赖文件不存在或比目标文件新,make 会执行相应的命令来更新目标文件。(如何检查的呢?)
  4. ​执行命令​​:make 会按照依赖图的顺序执行命令,生成最终的目标。

四、示例运行

假设你有以下文件:

  • main.c
  • add.c
  • sub.c

运行 make 命令:

make 会根据 makefile 中的规则,依次编译 main.cadd.c 和 sub.c,然后将它们链接成可执行文件 main

如果你修改了 add.c 文件,再次运行 make

make 会检测到 add.c 文件有更新,只重新编译 add.c 成 add.o,然后重新链接生成 main

如果你想清理生成的文件,可以运行:

make clean

make 会执行 clean 目标中的命令,删除 mainmain.oadd.o 和 sub.o 文件。

五、 .PHONY

在 makefile 中,.PHONY 是一个特殊的目标,用于声明某些目标是“伪目标”。伪目标不是实际的文件,而是用于执行特定的命令或任务。使用 .PHONY 可以避免与同名文件冲突,并且可以提高 make 的执行效率。

1.为什么需要 .PHONY
  1. ​避免与文件名冲突​​:如果有一个目标名与文件名相同,make 会误认为该目标是文件,而不是一个任务。使用 .PHONY 可以避免这种冲突。
  2. ​提高执行效率​​:make 会检查文件的时间戳来决定是否需要重新生成目标文件。对于伪目标,make 不需要检查时间戳,可以直接执行相应的命令,从而提高执行效率。
  3. ​明确意图​​:使用 .PHONY 可以明确告诉其他开发者,这个目标是一个虚拟的任务,而不是一个实际的文件。
2.如何使用 .PHONY

以下是一个简单的 makefile 示例,展示了如何使用 .PHONY

# 声明伪目标
.PHONY: clean test# 默认目标
all: main# 生成可执行文件 main
main: main.o add.o sub.ogcc main.o add.o sub.o -o main# 生成 main.o
main.o: main.cgcc -c main.c# 生成 add.o
add.o: add.cgcc -c add.c# 生成 sub.o
sub.o: sub.cgcc -c sub.c# 清理生成的文件
clean:rm -f main main.o add.o sub.o# 运行测试
test:./mainecho "All tests passed!"

在这个示例中:

  • .PHONY: clean test 声明了 clean 和 test 是伪目标。
  • clean 目标用于清理生成的文件,它不生成任何实际的文件。
  • test 目标用于运行测试,它也不生成任何实际的文件。

示例解释

1.声明伪目标

.PHONY: clean test

这行代码告诉 makeclean 和 test 是伪目标,而不是实际的文件。即使当前目录下存在名为 clean 或 test 的文件,make 也会执行相应的命令。

2. 使用伪目标

  • ​清理文件​​:

    make clean

    这条命令会执行 clean 目标中的命令,删除 mainmain.oadd.o 和 sub.o 文件。

  • ​运行测试​​:

    make test

    这条命令会执行 test 目标中的命令,运行 main 可执行文件,并输出 "All tests passed!"。

3. 避免冲突

假设当前目录下有一个名为 clean 的文件,如果没有使用 .PHONY 声明 clean 为伪目标,make 会认为 clean 是一个文件,而不是一个任务。此时,运行 make clean 不会执行任何命令,因为 clean 文件已经存在,且没有依赖关系需要更新。

通过使用 .PHONY,可以避免这种冲突,确保 make clean 总是执行清理命令。

.PHONY 不仅可以用于常见的清理和测试任务,还可以用于其他任何不需要生成实际文件的任务。

  • .PHONY 的作用​​:声明伪目标,避免与文件名冲突,提高执行效率,明确意图。
  • ​如何使用​​:在 makefile 中使用 .PHONY 关键字,后跟伪目标的名称列表。
  • ​常见用途​​:清理文件、运行测试、生成文档、打包发布、代码风格检查等。
  • 伪目标总是会被执行,不会被拦截。(比如我们重复make会提示已经make了不让我们make,但是如果我们把他搞成伪目标,那么就不会受此限制了)。

六、优点

  1. ​自动化​​:make 可以自动处理文件之间的依赖关系,只重新编译需要更新的文件,节省时间和资源。
  2. ​可维护性​​:通过 makefile,你可以清晰地定义项目的构建流程,方便团队协作和项目管理。
  3. ​灵活性​​:makefile 支持复杂的规则和条件判断,可以适应各种构建需求。

七、缺点

  1. ​维护成本​​:随着项目规模的增大,makefile 可能会变得非常复杂,维护起来比较困难。

八、总结

  • makefile​:是一个包含构建规则的文本文件,定义了如何从源文件生成目标文件以及各个目标文件之间的依赖关系。
  • make​:是一个构建自动化工具,读取 makefile 中的规则,并根据这些规则决定哪些文件需要重新编译或构建。

通过 make 和 makefile,你可以高效地管理和构建项目,确保每次构建都是基于最新的文件状态。

相关文章:

Linux make与makefile 项目自动化构建工具

本文章将对make与makefile进行一些基础的讲解。 假设我们要建造一座房子,建造过程涉及很多步骤,比如打地基、砌墙、安装门窗、粉刷墙壁等。每个步骤都有先后顺序,并且有些步骤可能依赖于其他步骤的完成。比如,你必须先打好地基才…...

鸿蒙 harmonyOS 网络请求

应用通过HTTP发起一个数据请求,支持常见的GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT方法。 接口说明 HTTP数据请求功能主要由http模块提供。 使用该功能需要申请ohos.permission.INTERNET权限。 第一步 : 在module.json5文件里面添加网络…...

【Tauri2】014——简单使用listen和emit

前言 【Tauri2】013——前端Window Event与创建Window-CSDN博客https://blog.csdn.net/qq_63401240/article/details/146981362?spm1001.2014.3001.5502【Tauri2】012——on_window_event函数-CSDN博客https://blog.csdn.net/qq_63401240/article/details/146909801?spm1001…...

解锁 C 语言安全新姿势:C11 安全函数全解析

一、开篇:C 语言安全的新护盾 在 C 语言的编程世界里,缓冲区溢出等安全问题犹如潜藏的暗礁,时刻威胁着程序的稳定与安全。为了有效应对这些挑战,C11 标准引入了一系列安全函数,也被称为 “Annex K” 标准库函数。这些…...

【centos】经常使用的脚本

磁盘挂载 yum install wget -y && wget -O auto_disk.sh http://download.bt.cn/tools/auto_disk.sh && bash auto_disk.shYum镜像源更换 bash <(curl -sSL https://linuxmirrors.cn/main.sh)Yum切换安装的java版本 sudo alternatives --config java...

Unity URP渲染管线详解

一、URP概述 Universal Render Pipeline (URP&#xff0c;通用渲染管线)是Unity推出的轻量级、高性能渲染管线解决方案&#xff0c;适用于移动平台、PC和主机等多种平台。 URP核心特点 跨平台支持&#xff1a;针对不同硬件自动优化 模块化设计&#xff1a;可扩展的渲染功能 …...

Python语言的测试用例设计

Python语言的测试用例设计 引言 随着软件开发的不断进步&#xff0c;测试在软件开发生命周期中的重要性日益凸显。测试用例设计是软件测试的核心&#xff0c;它为软件系统的验证和验证提供了实施的基础。在Python语言中&#xff0c;由于其简洁明了的语法和强大的内置库&#…...

【记录】kali制作绕过火绒检测的木马(仅通过MSF的方式)

目的&#xff1a;制作一个能够绕过火绒检测的简单木马&#xff0c;熟悉一下怎么使用msfvenom制作木马&#xff0c;因此此处使用的火绒版本较低。 工具准备&#xff1a;火绒安全-3.0.42.0 【点击免费下载工具】 **实验环境&#xff1a;**kali-2019.4 &#xff08;攻击方&…...

Linux系统进程

Linux系统进程 程序开始 编译链接的引导代码 操作系统下的应用程序在main执行前也需要先执行段引导代码才能去执行main&#xff0c;但写应用程序时不用考虑引导代码的问题&#xff0c;编译连接时&#xff08;准确说是链接时&#xff09;由链接器将编译器中事先准备好的引导代码…...

Obsidian按下三个横线不能出现文档属性

解决方案: 需要在标题下方的一行, 按下 键盘数字0后面那个横线(英文横线), 然后回车就可以了 然后点击横线即可...

GitHub 上开源一个小项目的完整指南

GitHub 上开源一个小项目的完整指南 &#x1f680; 第一步&#xff1a;准备你的项目 在开源之前&#xff0c;确保项目是可用且有一定结构的&#xff1a; ✅ 最低要求 项目文件清晰、结构合理&#xff08;比如&#xff1a;src/、README.md、LICENSE&#xff09;项目能在本地正…...

大模型——MCP 集成至 LlamaIndex 的技术实践

MCP 集成至 LlamaIndex 的技术实践 一、前言 本文主要介绍了如何将 MCP(Model Context Protocol,模型上下文协议)工具转换为可以直接使用的 LlamaIndex 工具,使 LlamaIndex 用户能像使用 Claude, Cursor 等现代 AI 应用一样无缝集成这些服务。 二、技术背景 2.1 什么是…...

leetcode 1123. 最深叶节点的最近公共祖先

给你一个有根节点 root 的二叉树&#xff0c;返回它 最深的叶节点的最近公共祖先 。 回想一下&#xff1a; 叶节点 是二叉树中没有子节点的节点树的根节点的 深度 为 0&#xff0c;如果某一节点的深度为 d&#xff0c;那它的子节点的深度就是 d1如果我们假定 A 是一组节点 S …...

LeetCode热题100记录-【链表】

链表 160.相交链表 思考&#xff1a;只要p1和p2不相等就一直在循环里&#xff0c;因为就算都为null也会走到相等 记录&#xff1a;需要二刷 public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {ListNode p1 headA,p2 headB;whi…...

Python 布尔类型

Python 布尔类型(Boolean) 布尔类型是Python中的基本数据类型之一&#xff0c;用于表示逻辑值。它只有两个值&#xff1a; True - 表示真False - 表示假 1. 布尔值的基本使用 # 定义布尔变量 is_active True is_admin Falseprint(is_active) # 输出: True print(is_admi…...

恒盾C#混淆加密卫士 - 混淆加密保护C#程序

对于大部分C#开发者来说&#xff0c;写完代码点个发布就完事儿了&#xff0c;但你可能不知道——用记事本都能扒开你编译好的程序&#xff01;像dnSpy这类反编译工具&#xff0c;分分钟能把你的EXE/DLL变回原汁原味的源代码&#xff0c;商业机密赤裸裸曝光不说&#xff0c;竞争…...

Java基础 4.4

1.方法快速入门 public class Method01 {//编写一个main方法public static void main(String[] args) {//方法使用//1.方法写好后&#xff0c;如果不去调用(使用)&#xff0c;不会输出Person p1 new Person();p1.speak();//调用方法 p1.cal01();//调用计算方法1p1.cal02(10);…...

黑马点评redis改 part 1

本篇将主要阐述短信登录的相关知识&#xff0c;感谢黑马程序员开源&#xff0c;感谢提供初始源文件&#xff08;给到的是实战第7集开始的代码&#xff09;【Redis实战篇】黑马点评学习笔记&#xff08;16万字超详细、Redis实战项目学习必看、欢迎点赞⭐收藏&#xff09;-CSDN博…...

降维算法之t-SNE

t-SNE&#xff08;t-Distributed Stochastic Neighbor Embedding&#xff09;算法详解 先说理解&#xff1a; t-SNE&#xff08;t-distributed Stochastic Neighbor Embedding&#xff09;是一种用来“可视化高维数据”的降维方法&#xff0c;通俗来说&#xff0c;它就像一个…...

使用 .NET 9 和 Azure 构建云原生应用程序:有什么新功能?

随着 .NET 9 推出一系列以云为中心的增强功能&#xff0c;开发人员拥有比以往更多的工具来在 Azure 上创建可扩展、高性能的云原生应用程序。让我们深入了解 .NET 9 中的一些出色功能&#xff0c;这些功能使构建、部署和优化云应用程序变得更加容易&#xff0c;并附有示例以帮助…...

python基础-10-组织文件

文章目录 【README】【10】组织文件&#xff08;复制移动删除重命名&#xff09;【10.1】shutil模块(shell工具)【10.1.1】复制文件和文件夹【10.1.1.1】复制文件夹及其下文件-shutil.copytree 【10.1.2】文件和文件夹的移动与重命名【10.1.3】永久删除文件和文件夹【10.1.4】用…...

从代码学习深度学习 - LSTM PyTorch版

文章目录 前言一、数据加载与预处理1.1 代码实现1.2 功能解析二、LSTM介绍2.1 LSTM原理2.2 模型定义代码解析三、训练与预测3.1 训练逻辑代码解析3.2 可视化工具功能解析功能结果总结前言 深度学习中的循环神经网络(RNN)及其变种长短期记忆网络(LSTM)在处理序列数据(如文…...

linux gcc

一、常用编译选项 ​基本编译 gcc [input].c -o [output] ​示例&#xff1a; gcc hello.c -o hello # 将 hello.c 编译为可执行文件 hello ./hello # 运行程序 ​分步编译 预处理&#xff1a;-E&#xff08;生成 .i 文件&#xff09; gcc -E hello.c -o hello…...

“一路有你”公益行携手《东方星动》走进湖南岳阳岑川镇中心小学

2025年4月2日&#xff0c;“一路有你”公益行携手《东方星动》走进湖南岳阳岑川镇&#xff0c;一场充满爱与温暖的捐赠仪式在岑川镇中心小学隆重举行。这是一场跨越千里的爱心捐赠&#xff0c;也是一场别开生面的国防教育&#xff0c;更是一场赋能提质的文化盛宴。 岑川镇地处湘…...

HTML语言的空值合并

HTML语言的空值合并 引言 在现代Web开发中&#xff0c;HTML&#xff08;超文本标记语言&#xff09;是构建网页的基础语言。随着前端技术的快速发展&#xff0c;开发者们面临着大量不同的工具和技术&#xff0c;尤其是在数据处理和用户交互方面。空值合并是一些编程语言中常用…...

并发上传及 JS 的单线程特性

1. JS 的单线程特性 JS 是单线程特性&#xff0c;这意味着所有代码都在一个线程上&#xff08;即主线程&#xff09;执行&#xff0c;同一时间只有一个任务在执行&#xff0c;其他任务都在等待。 这意味着即使有多个异步操作&#xff0c;它们的回调函数也会按顺序执行&#xff…...

c语言学习16——内存函数

内存函数 一、memcpy使用和模拟实现1.1参数1.2 使用1.3 模拟实现 二、memmove使用和模拟实现2.1 参数2.2 使用2.3 模拟实现 三、memset使用3.1 参数3.2 使用 四、memcmp使用4.1 参数4.2 使用 一、memcpy使用和模拟实现 1.1参数 因为内存中不知道存的是什么类型的地址&#xff…...

html5炫酷3D文字效果项目开发实践

炫酷3D文字效果项目开发实践 这里写目录标题 炫酷3D文字效果项目开发实践项目概述技术实现1. 基础HTML结构2. 核心CSS技术2.1 3D空间设置2.2 文字立体效果2.3 动画效果 3. 交互优化3.1 鼠标悬停效果3.2 光晕效果 性能优化考虑项目亮点总结 项目概述 在这个项目中&#xff0c;我…...

【前端】【tailwind】tailwind默认重置了样式

Tailwind CSS 自身已经内置了现代化的样式重置方案 —— Preflight&#xff08;基于 modern-normalize&#xff09;&#xff0c;这意味着在大多数情况下不需要额外引入传统的 reset.css 或 normalize.css。但具体是否需要补充重置&#xff0c;取决于你的项目需求&#xff0c;以…...

学透Spring Boot — 009. Spring Boot的四种 Http 客户端

目录 常见的HttpClient Spring 提供的HttpClient RestTemplate Spring 提供的模板类 XXXTemplate RestTemplate的使用 RestTemplate的使用技巧 RestTemplate的问题 RestClient RestClinet的基本使用 RestClient的自动配置 RestClient 序列化对象 异常处理 onStatus …...

STM32单片机入门学习——第14节: [6-2] 定时器定时中断定时器外部时钟

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难&#xff0c;但我还是想去做&#xff01; 本文写于&#xff1a;2025.04.04 STM32开发板学习——第14节: [6-2] 定时器定时中断&定时器外部时钟 前言开发…...

Python 元组

Python 元组 元组的介绍 元组和列表很像&#xff0c;都是用来保存多个数据使用一对小括号()来表示一个元组元组和列表的区别在于&#xff0c;列表是可变数据类型&#xff0c;而元组是不可变数据类型 nums (9, 4, 3, 1, 9, 7, 6, 9, 3, 9) print(nums) # (9, 4, 3, 1, 9, 7…...

Linux系统编程:进程管理、内存对比与树莓派应用

一、认识进程和线程&#xff0c;在Linux系统下查看系统中各进程的编号pid并终止一个进程pid 1.进程和线程 ​​进程​​&#xff1a;操作系统分配资源&#xff08;如内存、CPU时间片&#xff09;的基本单位。每个进程有独立的内存空间&#xff0c;进程间通信需要较复杂的机制…...

JSON介绍

JSON 的核心特点​​ ​​易读易写​​&#xff1a;纯文本格式&#xff0c;结构清晰&#xff08;像“键值对”的集合&#xff09;。​​通用性强​​&#xff1a;任何语言都能解析或生成 JSON。​​用途广泛​​&#xff1a;常用于前后端数据传输、配置文件、API 接口等。 &am…...

【Cursor】切换主题

右键顶部&#xff0c;把菜单栏勾上 首选项-主题-颜色主题 选择和喜欢的颜色主题即可&#xff0c;一般是“现代深色”...

【C++11(上)】—— 我与C++的不解之缘(三十)

一、C11 这里简单了解一下C发展好吧&#xff1a; C11是C的第二个大版本&#xff0c;也是自C98以来最重要的一个版本。 它引入了大量的更改&#xff0c;它曾被人们称为C0x&#xff0c;因为它被期待在2010年之前发布&#xff1b;但在2011年8月12日才被采纳。 C03到C11花了8年时间…...

python如何把列表中所有字符变成小写

在Python中&#xff0c;你可以使用列表推导式&#xff08;list comprehension&#xff09;结合字符串的.lower()方法&#xff0c;将列表中的所有字符串元素转换为小写。以下是一个示例&#xff1a; # 定义一个包含字符串的列表 strings ["Hello", "WORLD"…...

DEAP数据集介绍

DEAP数据集介绍 0. 数据集摘要1. 文件列表2. 文件详细信息2.1 Online_ratings2.2 Video_list2.3 Participant_ratings2.4 Participant_questionnaire2.5 Face_video.zip2.6 Data_original.zip2.7 Data_preprocessed_matlab.zip 和 Data_preprocessed_python.zip 3. References欢…...

基于RDK X3的“校史通“机器人:SLAM导航+智能交互,让校史馆活起来!

视频标题&#xff1a; 【校史馆の新晋顶流】RDK X3机器人&#xff1a;导览员看了直呼内卷 视频文案&#xff1a; 跑得贼稳团队用RDK X3整了个大活——给校史馆造了个"社牛"机器人&#xff01; 基于RDK X3开发板实现智能导航与语音交互SLAM技术让机器人自主避障不…...

JavaScript基础-window.localStorage

在现代Web开发中&#xff0c;数据存储对于提升用户体验至关重要。window.localStorage 是一种简单而强大的客户端存储机制&#xff0c;允许网页以键值对的形式持久化保存数据。与 sessionStorage 不同&#xff0c;localStorage 中的数据不会因浏览器标签页关闭或刷新而丢失&…...

在航电系统中提高可靠性的嵌入式软件设计

1.总线余度设计 数据传输采用双余度总线设计&#xff0c;CANFD为主&#xff0c;RS485为备。发送方将相同的数据分别通过双总线来发送&#xff0c;接收方优先处理主线数据。由于总线上数据频率固定&#xff0c;可设置定时器监控主总线的数据&#xff0c;当定时器超时后&#xff…...

H.266/VVC SCC技术学习:块差分脉冲编码调整(block differential pulse coded modulation, BDPCM)

近年来&#xff0c;屏幕内容视频广泛用于多媒体应用&#xff0c;例如远程桌面,屏幕共享等。由于屏幕内容视频的特性与自然视频有较大区别&#xff0c;VVC中使用了帧内块复制&#xff08;intra block copy, 即IBC&#xff09;, 调色板&#xff08;Palette&#xff09;&#xff0…...

网络编程—Socket套接字(TCP)

上篇文章&#xff1a; 网络编程—Socket套接字&#xff08;UDP&#xff09;https://blog.csdn.net/sniper_fandc/article/details/146923670?fromshareblogdetail&sharetypeblogdetail&sharerId146923670&sharereferPC&sharesourcesniper_fandc&sharefro…...

数据结构:二叉树(三)·(重点)

二叉树的存储结构 ⼆叉树⼀般可以使⽤两种结构存储&#xff0c;⼀种顺序结构&#xff0c;⼀种链式结构。 顺序结构 顺序结构存储就是使⽤数组来存储&#xff0c;⼀般使⽤数组只适合表⽰完全⼆叉树&#xff0c;因为不是完全⼆叉树会有 空间的浪费&#xff0c;完全⼆叉树更适合…...

StyleTTS 2:文本到语音(Text-to-Speech, TTS)模型

StyleTTS 2 是一种先进的文本到语音&#xff08;Text-to-Speech, TTS&#xff09;模型&#xff0c;通过结合风格扩散&#xff08;style diffusion&#xff09;和对抗训练&#xff08;adversarial training&#xff09;&#xff0c;利用大规模语音语言模型&#xff08;Speech La…...

痉挛性斜颈康复路,饮食要点来相助

痉挛性斜颈患者除了接受正规治疗&#xff0c;合理饮食对缓解症状、促进康复也至关重要。 高蛋白质食物是饮食中的重点。像鸡蛋&#xff0c;富含人体必需的氨基酸&#xff0c;其组成与人体组成模式接近&#xff0c;易于吸收。每天吃 1 - 2 个鸡蛋&#xff0c;能为身体补充修复肌…...

谷歌 Gemini 2.5 Pro 免费开放

2025 年 3 月 30 日&#xff0c;谷歌宣布将最新的 Gemini AI 旗舰模型 Gemini 2.5 Pro 免费向所有 Gemini 应用用户开放。以下是关于此次免费开放的一些具体信息1&#xff1a; 背景&#xff1a;此前&#xff0c;Gemini 2.5 Pro 仅向支付 19.99 美元月费的 Gemini Advanced 用户…...

规则引擎Drools

1.规则引擎概述 1.1 什么是规则引擎 规则引擎 全称为业务规则管理系统&#xff0c;英文名为BRMS&#xff0c;规则引擎的主要思想是将应用程序中的业务决策部分分离出来&#xff0c;并使用预定义的语义模块编写业务规则&#xff0c;由用户或开发者在需要时进行配置和管理。 需…...

第三季:挪威

挪威 挪威是北欧的一个国家&#xff0c;位于斯堪的纳维亚半岛的西部。以下是关于挪威的详细介绍&#xff1a; 地理位置与自然环境 位置&#xff1a;挪威位于北欧&#xff0c;东邻瑞典&#xff0c;东北与芬兰和俄罗斯接壤&#xff0c;西濒挪威海&#xff0c;北临巴伦支海。地…...

搜索与图论 树的深度优先遍历 树的重心

树的一种特殊的图&#xff0c;无环连通图 图还分为有向图&#xff0c;无向图 但是无向图其实也是特殊的有向图 &#xff08;a指向b&#xff0c;b也指向a&#xff0c;每个连接节点都如此&#xff0c;则是无向图&#xff09; 那我们只需要讨论有向图 有向图的分类 邻接矩阵 …...