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

Linux Makefile-概述、语句格式、编写规则、多文件编程、Makefile变量分类:自定义变量、预定义变量

目录

1.make

1.1 make 命令格式

2.Makefile 核心概念‌ ‌

2.1创建并运行 Makefile步骤

3. Makefile编写

3.1最基础Makefile

3.1.1使用默认make命令

 3.1.2使用make -f 命令

3.1.3 gcc编译常用组合选项

3.1.4 make 和 make all区别

3.1.4.1 all 是默认目标

3.1.4.2 all 不是默认目标

3.1.4.3 没有定义 all 命令

3.1.4.3 强制设置 all 为默认目标

3.2多文件编程Makefile-基础

3.3makefile变量

3.3.1 makefile 变量概述

3.3.2 makefile 的变量分类:

3.3.3 自定义变量语法

3.3.3.1自定义变量makefile多文件编程

3.3.4系统变量

3.3.5预定义变量

3.3.5.1编译器与工具

3.3.5.2. 编译选项

3.3.5.3. 文件与目录

3.3.5.4. 隐式规则中的关键变量

3.3.5.5. 常用内置变量

3.3.5.6.程序验证

4.几种多文件编程Makefile对应关系


1.make

make是个命令,是个可执行程序,用来解析Makefile文件的命令。
终端输入:which make 查看make保存地址,在 /usr/bin/make

1.1 make 命令格式

make [ ‐f file ] [ targets ]
(1)[ -f file ]:
make默认在工作目录中寻找名为GNUmakefile、makefile、Makefile的文件作为
makefile输入文件, -f 可以指定以上名字以外的文件作为makefile输入文件
(2)[ targets ]:
若使用make命令时没有指定目标,则make工具默认会实现makefile文件内的第一个目 标,然后退出,指定了make工具要实现的目标,目标可以是一个或多个(多个目标间用空 格隔开)。

2.Makefile 核心概念‌ ‌

作用‌:

自动化编译和链接程序,管理项目依赖关系,避免重复编译未修改的代码。

‌基本结构:

target: dependenciescommand‌target‌: 生成的目标(如可执行文件、中间文件)
‌dependencies‌: 生成目标所需的文件或目标
‌command‌: 生成目标的命令(必须以 Tab 开头)

2.1创建并运行 Makefile步骤

基本步骤:

  • 创建文件:在项目根目录创建名为 Makefile 的文件(无后缀)。
  • 编写规则:定义目标(如可执行文件)、依赖(如 .c 和 .o 文件)和命令。
  • 运行命令:在终端执行 make 或 make <target>。

3. Makefile编写

3.1最基础Makefile

3.1.1使用默认make命令

程序:

main.c

#include <stdio.h>
#include "main.h"int main(int argc, char const *argv[])
{printf("main函数开始\n");printf("ABC = %d abc = %d\n",ABC, abc);return 0;
}

main.h

#define ABC 123
#define abc 456

makefile

main:main.c main.h gcc main.c -o main clean:rm main 

makefile内容解释:

main:main.c main.h //可执行文件main依赖main.c main.h
    gcc main.c -o main //由mian.c 生成可执行文件main
    
clean:
    rm main //执行 make clean 命令,删除可执行文件main

运行结果:

 3.1.2使用make -f 命令

将可执行文件main删除,Makefile复制一份,重命名为Makefile1,执行 make -f Makefile1

也可以正常执行make命令。执行结果与默认make命令结果相同。

3.1.3 gcc编译常用组合选项

选项作用示例
-o指定输出文件名gcc -c main.c -o main.o
-I指定头文件搜索路径gcc -c main.c -I../include
-Wall启用所有警告信息gcc -c main.c -Wall
-g生成调试信息(用于 GDB)gcc -c main.c -g
-O2启用优化(级别 2)gcc -c main.c -O2

3.1.4 make 和 make all区别

关键总结

场景make 行为make all 行为
all 是默认目标执行 all执行 all
all 不是默认目标执行第一个目标(如 build执行 all(需存在定义)
未定义 all执行第一个目标报错
强制 .DEFAULT_GOAL=all执行 all执行 all
3.1.4.1 all 是默认目标

当 all 是默认目标时,make 和 make all 运行顺序,结果相同。

程序:

main.c

#include <stdio.h>int main(int argc, const char *argv[])
{int x = 60;int y = 20;printf("main x= %d y= %d \n", x, y);return 0;
}

makefile

# all 是第一个目标(默认目标)
all:target echo " all开始"target:main.c gcc main.c -o mainecho " main开始"clean:rm main  *.o  -rf	

运行结果:当 all 是默认目标时,make 和 make all 运行顺序,结果相同。

(1)make all

(2)make

3.1.4.2 all 不是默认目标

all 不是默认目标,执行make all命令,会先执行 all依赖的命令。

程序:

 main.c

#include <stdio.h>int main(int argc, const char *argv[])
{int x = 60;int y = 20;printf("main x= %d y= %d \n", x, y);return 0;
}

makefile

# 若makefile命名不是 GNUmakefile、makefile、Makefile 中的一个
# 要使用 make -f Makefile名称,执行make命令# all 不是第一个目标
target:main.c gcc main.c -o mainecho " main开始"all:clean  targetecho " all开始"clean:rm main  *.o  -rf

运行结果:

(1) 首次make 编译, 执行默认目标 target,编译 gcc main.c -o main

(2)执行make all命令,会先执行 clean命令  rm main *.o -rf,在编译gcc main.c -o main

3.1.4.3 没有定义 all 命令

 main.c

#include <stdio.h>int main(int argc, const char *argv[])
{int x = 60;int y = 20;printf("main x= %d y= %d \n", x, y);return 0;
}

makefile

# 若makefile命名不是 GNUmakefile、makefile、Makefile 中的一个
# 要使用 make -f Makefile名称,执行make命令target:main.c gcc main.c -o mainecho " main开始"clean:rm main  *.o  -rf

运行结果:make all运行报错,make正常运行。

3.1.4.3 强制设置 all 为默认目标

 main.c

#include <stdio.h>int main(int argc, const char *argv[])
{int x = 60;int y = 20;printf("main x= %d y= %d \n", x, y);return 0;
}

makefile

# 若makefile命名不是 GNUmakefile、makefile、Makefile 中的一个
# 要使用 make -f Makefile名称,执行make命令# 显式设置 .DEFAULT_GOAL 为 all
.DEFAULT_GOAL = alltarget:main.c gcc main.c -o mainecho " main开始"all:clean  targetecho " all开始"clean:rm main  *.o  -rf

运行结果:强制设置 all 为默认目标,执行make命令,先执行all依赖的语句。

3.2多文件编程Makefile-基础

main.c

#include "head.h"int main(int argc, const char *argv[])
{int x = 60;int y = 20;printf("%d + %d = %d\n", x, y, sum(x, y));printf("%d - %d = %d\n", x, y, sub(x, y));return 0;
}

sub.c

#include "head.h"int sub(int a, int b)
{return a - b;
}

sum.c

#include "head.h"int sum(int a, int b)
{return a + b;
}

head.h

#ifndef _HEAD_H_
#define _HEAD_H_#include <stdio.h>int sum(int a, int b);
int sub(int a, int b); #endif

Makefile

main:main.o sub.o sum.ogcc main.o sub.o sum.o -o mainmain.o:main.cgcc -c main.c -o main.osub.o:sub.cgcc -c sub.c -o sub.osum.o:sum.cgcc -c sum.c -o sum.oclean:rm *.o main a.out -rf

Makefile语句解释:
main:main.o sub.o sum.o //可执行文件main依赖于main.o sub.o sum.o
    gcc main.o sub.o sum.o -o main //gcc 编译 main.o sub.o sum.o 生成可执行文件main

main.o:main.c //可执行文件main.o依赖于main.c
    gcc -c main.c -o main.o //gcc 编译 main.c 生成可执行文件main.o

sub.o:sub.c //可执行文件sub.o依赖于sub.c
    gcc -c sub.c -o sub.o //gcc 编译 sub.c 生成可执行文件sub.o

sum.o:sum.c //可执行文件sum.o依赖于sum.c

        gcc -c sum.c -o sum.o //gcc 编译 sum.c 生成可执行文件sum.o

clean:
    rm *.o main a.out -rf //执行 make clean删除可执行文件,所有.o文件 main a.out

执行顺序:

可执行文件main依赖于main.o,main.o又依赖于main.c,先执行gcc -c main.c -o main.o,在执行gcc main.o sub.o sum.o -o main

运行结果:

3.3makefile变量

3.3.1 makefile 变量概述

makefile 变量类似于 C 语言中的宏,当 makefile make 工具解析时,其中的变量会被展开。
变量的作用:
保存文件名列表
保存文件目录列表
保存编译器名
保存编译参数
保存编译的输出
...

3.3.2 makefile 的变量分类:

1 、自定义变量
makefile 文件中定义的变量。
make 工具传给 makefile 的变量。
2 、系统环境变量
make 工具解析 makefile 前,读取系统环境变量并设置为 makefile 的变量。
3 、预定义变量(自动变量)

3.3.3 自定义变量语法

定义变量:
变量名 = 变量值
引用变量:
$( 变量名 ) ${ 变量名 }
makefile 的变量名 :
makefile 变量名可以以数字开头
注意:
1 、变量是大小写敏感的
2 、变量一般都在 makefile 的头部定义
3 、变量几乎可在 makefile 的任何地方使用

常用变量:

定义变量:VAR = value
使用变量:$(VAR)
常用内置变量:
CC:C 编译器(默认 cc,通常指向 gcc)。
CFLAGS:C 编译选项(如 -Wall -O2)。
LDFLAGS:链接选项(如 -L 指定库路径)。
LDLIBS:链接库(如 -lm 表示数学库)。
3.3.3.1自定义变量makefile多文件编程

程序:

 main.c

#include "head.h"int main(int argc, const char *argv[])
{int x = 60;int y = 20;printf("%d + %d = %d\n", x, y, sum(x, y));printf("%d - %d = %d\n", x, y, sub(x, y));return 0;
}

sub.c

#include "head.h"int sub(int a, int b)
{return a - b;
}

sum.c

#include "head.h"int sum(int a, int b)
{return a + b;
}

head.h

#ifndef _HEAD_H_
#define _HEAD_H_#include <stdio.h>int sum(int a, int b);
int sub(int a, int b); #endif

Makefile

CC=gcc
obj=main
obj1=sub
obj2=sum
OBJS=main.o sub.o sum.o$(obj):$(OBJS)$(CC) $(OBJS) -o $(obj)$(obj).o:$(obj).c$(CC) -c $(obj).c -o $(obj).o$(obj1).o:$(obj1).c$(CC) -c $(obj1).c -o $(obj1).o$(obj2).o:$(obj2).c$(CC) -c $(obj2).c -o $(obj2).oclean:rm *.o $(obj) a.out -rf

Makefile语句解释:与3.2多文件编程Makefile-基础,一样,只是替换为自定义的变量
main:main.o sub.o sum.o //可执行文件main依赖于main.o sub.o sum.o
    gcc main.o sub.o sum.o -o main //gcc 编译 main.o sub.o sum.o 生成可执行文件main

main.o:main.c //可执行文件main.o依赖于main.c
    gcc -c main.c -o main.o //gcc 编译 main.c 生成可执行文件main.o

sub.o:sub.c //可执行文件sub.o依赖于sub.c
    gcc -c sub.c -o sub.o //gcc 编译 sub.c 生成可执行文件sub.o

sum.o:sum.c //可执行文件sum.o依赖于sum.c

        gcc -c sum.c -o sum.o //gcc 编译 sum.c 生成可执行文件sum.o

clean:
    rm *.o main a.out -rf //执行 make clean删除可执行文件,所有.o文件 main a.out

执行顺序:

可执行文件main依赖于main.o,main.o又依赖于main.c,先执行gcc -c main.c -o main.o,在执行gcc main.o sub.o sum.o -o main

运行结果:

3.3.4系统变量

make 工具会拷贝系统的环境变量并将其设置为 makefile 的变量,在 makefile 中可直接读取或修改拷贝后的变量。
程序:
main.c
#include <stdio.h>int main(int argc, const char *argv[])
{int x = 60;int y = 20;printf("x = %d  y = %d \n", x, y);return 0;
}

Makefile

main:main.cgcc main.c -o main clean:rm main -rfecho $(PWD)echo $(HOME)echo $(HOSTNAME)echo $(MY_SHELL_NUM)
运行结果:
(1)先在终端执行shell脚本,设置一个预设环境变量,echo 输出一下。
MY_SHELL_NUM=123
export MY_SHELL_NUM
echo $MY_SHELL_NUM
(2)执行 make 命令,在执行 make clean 命令,shell语句的结果输出在终端。
分别输出 PWD ,HOME,HOSTNAME,MY_SHELL_NUM这四个变量的结果

3.3.5预定义变量

$@ 目标名
$< 依赖文件列表中的第一个文件
$^ 依赖文件列表中除去重复文件的部分
AR 归档维护程序的程序名,默认值为 ar
ARFLAGS 归档维护程序的选项
AS 汇编程序的名称,默认值为 as
ASFLAGS 汇编程序的选项
CC C 编译器的名称,默认值为 cc
CFLAGS C 编译器的选项
CPP C 预编译器的名称,默认值为$(CC) -E
CPPFLAGS C 预编译的选项
CXX C++编译器的名称,默认值为 g++
CXXFLAGS C++编译器的选项
3.3.5.1编译器与工具
变量名默认值描述示例用法
CCccC 编译器CC = gcc
CXXg++C++ 编译器CXX = clang++
ARar静态库打包工具AR = ar rcs
ASas汇编器AS = nasm
LDld链接器LD = lld
3.3.5.2. 编译选项
变量名描述默认值示例用法
CFLAGSC 编译选项CFLAGS = -O2 -Wall
CXXFLAGSC++ 编译选项CXXFLAGS = -std=c++17
CPPFLAGS预处理选项(C/C++通用)CPPFLAGS = -Iinclude
LDFLAGS链接器选项(如库路径)LDFLAGS = -Llib
LDLIBS链接的库(如 -lmLDLIBS = -lpthread
3.3.5.3. 文件与目录
变量名描述默认值示例用法
MAKEFILE_LIST当前 Makefile 文件名列表自动生成用于条件判断
VPATH搜索源文件的目录列表VPATH = src:lib
SRC自定义源文件变量SRC = main.c utils.c
OBJ自定义目标文件变量OBJ = $(SRC:.c=.o)
3.3.5.4. 隐式规则中的关键变量

Make 根据文件后缀自动推导编译规则,以下变量控制隐式规则行为:

变量名描述默认命令示例覆盖
COMPILE.cC 文件编译命令$(CC) $(CFLAGS) $(CPPFLAGS) -cCOMPILE.c = $(CC) -O3
LINK.cC 程序链接命令$(CC) $(CFLAGS) $(LDFLAGS)LINK.c = $(CC) -flto
3.3.5.5. 常用内置变量
变量名描述示例值
MAKE当前 Make 命令路径/usr/bin/make
MAKECMDGOALS用户指定的目标列表all clean
CURDIR当前工作目录/home/user/project

3.3.5.6.程序验证

 程序:

 main.c

#include "head.h"int main(int argc, const char *argv[])
{int x = 60;int y = 20;printf("%d + %d = %d\n", x, y, sum(x, y));printf("%d - %d = %d\n", x, y, sub(x, y));return 0;
}

sub.c

#include "head.h"int sub(int a, int b)
{return a - b;
}

sum.c

#include "head.h"int sum(int a, int b)
{return a + b;
}

head.h

#ifndef _HEAD_H_
#define _HEAD_H_#include <stdio.h>int sum(int a, int b);
int sub(int a, int b); #endif

Makefile

CC=gcc
obj=main
obj1=sub
obj2=sum
OBJ=main.o sub.o sum.o
CFLAGS=-Wall -O2   
# -Wall警告相关, -O2:优化选项,兼顾编译速度和性能$(obj):$(OBJ)$(CC) $^ -o $@$(obj).o:$(obj).c$(CC) $(CFLAGS) -c $< -o $@$(obj1).o:$(obj1).c$(CC) $(CFLAGS) -c $< -o $@$(obj2).o:$(obj2).c$(CC) $(CFLAGS) -c $< -o $@clean:rm *.o $(obj) a.out -rf

Makefile语句解释:

与3.3.3 自定义变量语法,一样,只是替换为预定义的变量。表达式的区别见4.几种多文件编程Makefile对应关系。

运行结果:

注:Makefile更精简表达式

Makefile1

CC=gcc
obj=main
OBJ=main.o sub.o sum.o
CFLAGS=-Wall -g$(obj):$(OBJ)$(CC) $^ -o $@%*.o:%*.c  #使用通配符匹配,所有.c文件都去执行下面的命令$(CC) $(CFLAGS) -c $< -o $@clean:rm *.o $(obj) a.out -rf

运行结果:与上述Makefile运行结果相同

(1)先在终端执行 make clean (2)终端执行 make -f Makefile1 

4.几种多文件编程Makefile对应关系

多文件编程Makefile最基础、自定义变量、预定义变量对应关系。

每一行为几种方法相同结果不同格式的变量表达式。

相关文章:

Linux Makefile-概述、语句格式、编写规则、多文件编程、Makefile变量分类:自定义变量、预定义变量

目录 1.make 1.1 make 命令格式 2.Makefile 核心概念‌ ‌ 2.1创建并运行 Makefile步骤 3. Makefile编写 3.1最基础Makefile 3.1.1使用默认make命令 3.1.2使用make -f 命令 3.1.3 gcc编译常用组合选项 3.1.4 make 和 make all区别 3.1.4.1 all 是默认目标 3.1.4.2 al…...

Kotlin日常使用函数记录

文章目录 前言字符串集合1.两个集合的差集2.集合转数组2.1.集合转基本数据类型数组2.2.集合转对象数组 Map1.合并Map1.1.使用 操作符1.2.使用 操作符1.3.使用 putAll 方法1.4.使用 merge 函数 前言 记录一些kotlin开发中&#xff0c;日常使用的函数和方式之类的&#xff0c;…...

【JavaScript】异步编程

个人主页&#xff1a;Guiat 归属专栏&#xff1a;HTML CSS JavaScript 文章目录 1. 异步编程基础1.1 同步与异步1.1.1 同步执行1.1.2 异步执行 1.2 JavaScript 事件循环 2. 回调函数2.1 基本回调模式2.2 错误处理2.3 回调地狱 3. Promise3.1 Promise 基础3.2 Promise 链式调用3…...

批量合并多张 jpg/png 图片为长图或者 PDF 文件,支持按文件夹合并图片

我们经常会碰到需要将多张图片拼成一张图片的场景&#xff0c;比如将多张图片拼成九宫格图片&#xff0c;或者将多张图片拼成一张长图。还有可能会碰到需要将多张图片合并成一个完整的 PDF 文件来方便我们进行打印或者传输等操作。那这些将图片合并成一张图片或者一个完整的文档…...

使用docker 安装向量数据库Milvus

Miluvs 官网 www.milvus.io/ https://milvus.io/docs/zh/install_standalone-docker-compose-gpu.md 一、基本概念 向量数据库&#xff1a;Milvus是一款云原生向量数据库&#xff0c;它支持多种类型的向量&#xff0c;如浮点向量、二进制向量等&#xff0c;并且可以处理大规模…...

在线PDF文件拆分工具,小白工具功能实用操作简单,无需安装的文档处理工具

小白工具中的在线 PDF 文件拆分工具是一款功能实用、操作便捷的文档处理工具&#xff0c;以下是其具体介绍&#xff1a; 操作流程 上传 PDF 文档&#xff1a;打开小白工具在线PDF文件拆分工具 - 快速、免费拆分PDF文档 - 小白工具的在线 PDF 文件拆分页面&#xff0c;通过点击 …...

Blender画图——阵列使用

如图我需要多个图示的图形&#xff0c;并且排成一个阵列效果。 如图依次点击效果。不要用相对偏移&#xff0c;要用恒定偏移。 如图设置数量。 如图完成x方向的画图后&#xff0c;我们需要在y方向再用一个阵列。...

VSCode 常用快捷键

Visual Studio Code (VSCode) 提供了许多快捷键&#xff0c;以帮助开发者提高编码效率。以下是一些常用的 VSCode 快捷键&#xff0c;这些快捷键适用于大多数操作系统&#xff0c;但在 macOS 上可能会有所不同&#xff08;通常是将 Ctrl 替换为 Cmd&#xff09;。 1. 文件和编…...

缓存相关问题

Redis 持久化机制 缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题 热点数据和冷数据是什么 Memcache与Redis的区别都有哪些? 单线程的redis为什么这么快 redis的数据类型,以及每种数据类型的使用场景,Redis 内部结构 redis的过期策略以及内存淘汰机制 Redis 为什么…...

每日一题(小白)暴力娱乐篇22

为什么要经常学习暴力和一些娱乐呢&#xff1f;因为对于我们来说&#xff0c;暴力是最直接的方式是肯定能满足一部分答案的方法&#xff0c;娱乐是为了让算法变得更有趣&#xff0c;你愿意多去尝试多去练习&#xff0c;这才是最要紧的。 由题意知&#xff0c;就是计算两个数字…...

深入理解 Vuex:核心概念、API 详解与最佳实践

目录 Vuex 简介核心概念与工作流程核心 API 详解模块化开发 &#xff08;modules&#xff09;插件&#xff08;Plugins&#xff09;与扩展高级技巧与最佳实践 Vuex 简介 Vuex 是 Vue.js 的官方状态管理库&#xff0c;专为复杂应用设计&#xff0c;用于集中管理所有组件的共享状…...

成为一种国家战略范畴的新基建的智慧园区开源了。

智慧园区场景视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。用户只需在界…...

拜特科技助力科达制造,资金管理信息化迈入新阶段

近日&#xff0c;拜特科技成功签约科达制造股份有限公司&#xff08;以下简称“科达制造”&#xff09;资金管理系统升级项目。科达制造通过资金管理系统的不断迭代升级和优化&#xff0c;能够更加高效地管理和运用资金&#xff0c;提高企业的资金利用效率&#xff0c;满足企业…...

每日一题(小白)暴力娱乐篇20

这个题用瞪眼法解决&#xff0c;snakeaekns 代码如下&#x1f447; public static void main(String[] args) {Scanner scannew Scanner(System.in);System.out.println("aekns");scan.close();} 第二种方式&#xff1a;将snack拆解&#xff0c;按照大小进行排序。…...

Flutter iOS 项目中 VolumeControllerPlugin 报错解决方案

Flutter iOS 项目中 VolumeControllerPlugin 报错解决方案 在开发 Flutter 应用时&#xff0c;有时会遇到 iOS 项目构建失败的情况&#xff0c;其中一种较为常见的错误是与 VolumeControllerPlugin 相关的报错&#xff0c;错误信息如下&#xff1a; Could not build the prec…...

Java实战报错 tcp

为什么报错tcp Preview 从图片中的错误信息来看&#xff0c;程序遇到了 java.net.BindException&#xff0c;具体错误信息是 "Address already in use: bind"。这意味着你的程序试图绑定到一个已经被其他进程占用的端口&#xff08;在本例中是9999端口&#xff09;。…...

【补题】P10424 [蓝桥杯 2024 省 B] 好数(数位dp)

题意&#xff1a; 一个整数如果按从低位到高位的顺序&#xff0c;奇数位&#xff08;个位、百位、万位……&#xff09;上的数字是奇数&#xff0c;偶数位&#xff08;十位、千位、十万位……&#xff09;上的数字是偶数&#xff0c;我们就称之为“好数”。 给定一个正整数 N…...

控制 ElementUI el-table 树形表格多选框的显示层级

1、你可以通过 selectable 属性来控制哪些行可以选择&#xff08;显示多选框&#xff09; <el-table:data"tableData"row-key"id"default-expand-all:tree-props"{children: children, hasChildren: hasChildren}"select"handleSelect&…...

今日行情明日机会——20250409

今日行情还需要考虑关税对抗~ 2025年4月8日涨停的主要行业方向分析 1. 军工&#xff08;19家涨停&#xff09; 细分领域&#xff1a;国防装备、航空航天、军民融合。催化因素&#xff1a;国家安全战略升级、国防预算增加、重大军工项目落地预期。 2. 免税&#xff08;15家涨…...

基础知识补充篇:什么是DAPP前端连接中的provider

专栏:区块链入门到放弃查看目录-CSDN博客文章浏览阅读352次。为了方便查看将本专栏的所有内容列出目录,按照顺序查看即可。后续也会在此规划一下后续内容,因此如果遇到不能点击的,代表还没有更新。声明:文中所出观点大多数源于笔者多年开发经验所总结,如果你想要知道区块…...

47常用控件_QWidget的toolTip属性

一个 GUI 程序,界面比较复杂, 按啥的很多~~ 当你把鼠标悬停到这个控件上的时候,就能弹出一个提示~~ setToolTip&#xff1a;设置提示内容 setToolTipDuring&#xff1a;设置提示的时间 toolTip 只是给用户看的.在代码中一般不需要获取到 toolTip. 代码示例: 设置按钮的 toolT…...

解密工业控制柜:认识关键硬件(PLC)

前言 作为一名视觉开发工程师&#xff0c;我们不仅要做到做好自己的工作&#xff0c;我们更需要在工业现场学习更多知识&#xff0c;最近网上流传很多&#xff0c;“教会徒弟&#xff0c;饿死师傅”&#xff1b;在自动化行业中&#xff0c;在项目下来很忙的时候&#xff0c;我们…...

PDF编辑,小白工具功能丰富多样,在线无需下载,操作便捷,新手小白必备

在当今数字化办公和学习的时代&#xff0c;PDF 文件的使用极为广泛&#xff0c;而小白工具的在线 PDF 浏览器以其强大且丰富的功能&#xff0c;成为了一款不可多得的优质 PDF 阅读工具&#xff0c;PDF编辑,在线无需下载,操作便捷,新手小白必备以下为您详细推荐&#xff1a; 功能…...

网络安全公司推荐:F5荣膺IDC全球Web应用与API防护领导者

API的广泛使用正推动安全实践的重大变革。研究表明&#xff0c;有41%的企业管理的API数量至少与应用数量相等&#xff0c;因此企业亟需实现全面的API防护。近日&#xff0c;IDC发布《IDC MarketScape&#xff1a;2024年全球Web应用和API防护企业平台供应商评估报告》&#xff0…...

WPF轮播图动画交互 动画缩放展示图片

WPF轮播图动画交互 动画缩放展示图片 效果如下图&#xff1a; XAML代码&#xff1a; <Window x:Class"Caroursel.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/20…...

玩转Docker | 使用Docker安装FileDrop文件共享工具

玩转Docker | 使用Docker安装FileDrop文件共享工具 前言一、FileDrop介绍FileDrop简介主要特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署FileDrop服务下载镜像创建容器检查容器状态检查服务端口安全设置四、访问FileDrop应用创建名称五、测试与使用…...

实战篇-主时钟约束

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据 总结 前言 这是对B站傅里叶的猫视频时钟约束的笔记 一、主时钟约束 report_clock_networks …...

Oracle JDBC驱动 ojdbc14:使用指南与版本说明(附资源下载)

ojdbc14 是 Oracle 公司提供的 JDBC&#xff08;Java 数据库连接&#xff09;驱动程序&#xff0c;用于连接 Java 应用程序与 Oracle 数据库。 ojdbc14.jar包已下载&#xff1a;https://pan.quark.cn/s/5ee7841dcd9c 关键信息 用途&#xff1a;使 Java 应用程序能够连接 Orac…...

spring mvc 异常处理中@RestControllerAdvice 和 @ControllerAdvice 对比详解

RestControllerAdvice 和 ControllerAdvice 对比详解 1. 基本概念 注解等效组合核心作用ControllerAdviceComponent RequestMapping&#xff08;隐式&#xff09;定义全局控制器增强类&#xff0c;处理跨控制器的异常、数据绑定或全局响应逻辑。RestControllerAdviceControll…...

单元测试原则之——不要过度模拟

什么是过度模拟? 过度模拟(over-mocking)是指在单元测试中,模拟了太多依赖项,甚至模拟了本不需要模拟的简单对象或行为。过度模拟会导致: 测试代码变得复杂,难以阅读和维护。测试逻辑偏离了实际业务逻辑,无法验证真实代码的行为。忽略了被测单元与依赖项之间的真实交互…...

云轴科技ZStackCTO王为:AI Infra平台具备解决私有化AI全栈难题能力

4月1-2日&#xff0c;2025中国生成式AI大会在北京举办&#xff0c;该会议已成为国内AI领域最具影响力的产业峰会之一。云轴科技ZStack CTO王为受邀在“大模型”峰会上发表主题为《AI 原生实践&#xff1a;企业实际场景的 AI 赋能与 Infra 实践探索》演讲&#xff0c;并参加《De…...

牛客 小苯的Z串匹配

注意数组元素是0的情况 #include<iostream> using namespace std;int t; const int N2e510;int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>t;while(t){long long n;cin>>n;long long a[N];for(int i0; i<n; i) cin>>a[i];stri…...

拜特科技受邀参加跨境电商行业分会,共探资金管理数字化与AI应用新路径

3月12日&#xff0c;由广东省首席信息官协会主办的“跨境电商行业分会——走进绿联科技”活动在深圳绿联科技圆满举行。作为专注于金融科技与资金管理数字化解决方案的领先提供商&#xff0c;拜特科技受邀参加此次会议&#xff0c;与行业精英共同探讨跨境电商企业的资金管理数字…...

贪心算法(17)(java)可被三整除的最大整数和

给你一个整数数组 nums&#xff0c;请你找出并返回能被三整除的元素 最大和。 示例 1&#xff1a; 输入&#xff1a;nums [3,6,5,1,8] 输出&#xff1a;18 解释&#xff1a;选出数字 3, 6, 1 和 8&#xff0c;它们的和是 18&#xff08;可被 3 整除的最大和&#xff09;。 …...

架构师面试(二十八):业务建模

问题 今天我们撇开纯技术&#xff0c;聊一下关于【业务建模】的话题。 何为业务建模&#xff1f;即通过易于理解的模型将业务中的关键问题准确表达出来。 业务建模是需求分析环节乃至整个软件生命周期中非常关键的一环&#xff0c;它几乎决定了软件的开发周期和成本。下面关…...

求教:vue中的find()函数的用法this.$set

需求&#xff1a;为了实现联动&#xff0c;当我在选择问题标题之后&#xff0c;后面几列的内容就会自动联动显示 方案一&#xff1a; 选完之后 直接 是this.questionList[index] this.selected; 这样的效果虽然改动了数组&#xff0c;但是页面上没有显示出来实际数组的内容 …...

常见算法模板总结

文章目录 一、二叉树1. DFS2. BFS 二、回溯模板三、记忆化搜索四、动态规划1. 01背包朴素版本滚动数组优化 2. 完全背包朴素版本滚动数组优化 3. 最长递增子序列LIS朴素版本贪心二分优化 4. 最长公共子序列5. 最长回文子串 五、滑动窗口六、二分查找七、单调栈八、单调队列九、…...

生产者消费者模型

目录 一、生产者消费者模型 1. 生产者消费者模型是什么&#xff1f; 2. 为什么使用生产者消费者模型&#xff1f; 3. 生产者消费者模型的特点&#xff08;321原则&#xff09; &#x1f335;3种关系 &#x1f335;2种角色 &#x1f335;1个交易场所 二、基于BlockingQue…...

linux里怎么禁用 其他用户使用sudo添加定时器,例如创建的tomcat用户禁止使用 sudo crontab -u tomcat -e 添加定时器

要禁止 tomcat 用户通过 sudo crontab -u tomcat -e 添加定时任务&#xff0c;需从 sudo 权限控制和 crontab 访问限制两方面入手。以下是具体步骤&#xff1a; 一、核心思路 禁止 tomcat 用户使用 sudo 提权执行 crontab 修改 /etc/sudoers 配置&#xff0c;移除 tomcat 用户…...

函数作为返回值输出

实际上&#xff0c;函数当做返回值输出的应用场景也很多&#xff0c;也更能体现函数式变成的巧妙&#xff0c;让函数继续返回一个可执行的函数&#xff0c;意味着运算过程是可延续的。 判断数据的类型 常见的判断一个数据的类型的函数&#xff1a; 单例模式 下面是一个单例模…...

黑马 SpringAI+DeepSeek 实战:从对话机器人到企业级知识库的大模型开发全攻略

附完整代码 项目案例&#xff0c;3 天吃透大模型应用开发核心技术 需要完整项目学习视频以及源码的私信博主&#xff0c;谢谢~大家一起加油呐&#xff01;&#xff01; 01.认识AI和大模型 小结 AI的发展过程 符号主义 机器学习 深度学习——自然语言处理&#xff08;NLP…...

word表格间隔设置

1.怎么解决word表格间隔达不到我们想要的要求 其实很简单, 我们直接在word表格里面, 全选表格中里面的内容。接着,我们选择自动调整---->根据内容自动调整表格,即可达到我们想要的要求...

Windows批处理脚本,bat 循环数组进入文件夹进行后续操作

文章目录 前言一、脚本功能解析1.2、定义数组1.2、遍历数组1.2、处理每个数组元素1.2、循环控制1.2、结束脚本 二、之前编写的脚本三、优化后的脚本代码四、总结五、感谢 前言 Windows批处理脚本&#xff0c;主要功能是遍历一个预定义的数组&#xff0c;并对每个数组元素执行cd…...

TurtleBot3 Package turtlebot3_drive source code read

前言 此处阅读简单的 turtlebot3_drive 代码。 从ROS的角度&#xff0c;作为一个demo&#xff0c;它足够小、简单&#xff0c;可以从中看见ROS的 NodeHandle如何使用。此外&#xff0c;我们也能简单地看到 “自动避障功能的实现”。 从C的角度&#xff0c;它实际上并不复杂&…...

机器学习的下一个前沿是因果关系吗?

如今&#xff0c;越来越多研究人员意识到&#xff0c;将因果关系融入机器学习&#xff0c;或许会是该领域实现重大突破的关键所在。 机器学习凭借先进的预测能力&#xff0c;已为诸多行业带来了显著变革&#xff0c;但也暴露出了一定的局限性。而因果关系&#xff0c;作为理解…...

Mujoco xml模型

Mujoco xml模型 一个例子compileroptionassetmesh default基本使用childclass与class多个class worldbodybody关系inertialjointgeom XML主要分为以下三个部分&#xff1a; < asset> &#xff1a; 用 tag导入STL文件&#xff1b;< worldbody>&#xff1a;用tag定义…...

MyBatis 详解及代码示例

MyBatis 是一个 半自动 ORM 框架&#xff0c;主要用于 Java 与数据库之间的持久化操作&#xff0c;它本质是对 JDBC 的封装 全名&#xff1a;MyBatis&#xff08;前身 iBATIS&#xff09;核心作用&#xff1a;自动将 SQL 执行结果映射为 Java 对象&#xff1b;也可以将 Java 对…...

STL-list链表

STL-list链表实现 STL中采用双向带头循环链表来实现 list,下面将使用 C++ 实现 STL list 链表。 list 类中包含两个主要部分,一个是指向哨兵位头节点的指针(_head),另一个是结构体类型的迭代器(__list_iterator)。 哨兵位头节点本身是不存储数据的,它只是用于简化代码…...

R语言中的rvest库写个视频爬虫通用代码

朋友让我用R语言的rvest库写一个通用的视频爬虫代码示例。首先&#xff0c;我需要回忆一下rvest库的主要功能&#xff0c;它主要是用来做网页抓取和解析的&#xff0c;类似于Python的BeautifulSoup。但是视频爬虫的话&#xff0c;可能需要处理动态加载的内容&#xff0c;或者找…...

SQLite 中日期型数据定义及处理(Delphi 版本)

在使用SQLite的时候&#xff0c;肯定需要使用到日期型数据类型&#xff0c;但是SQLite没有直接支持日期类型&#xff0c;比如在其他数据库中支持的DateTime类型&#xff0c;在Delphi中是TDateTime类型。 那么实际处理中应该如何处理呢&#xff1f; 可以使用两种方式类在SQLit…...