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.2.1 使用make -f 命令執行默認make操作

3.1.2.2使用 make [ ‐f file ] [ targets ]命令

3.1.2.3使用 make [ ‐f file ] [ targets ]命令,并執行可執行程序

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編寫

?make 命令格式

make [ ‐f file ] [ targets ]
(1)[ -f file ]:
make默認在工作目錄中尋找名為GNUmakefile、makefile、Makefile的文件作為
makefile輸入文件, -f 可以指定以上名字以外的文件作為makefile輸入文件
(2)[ targets ]:
若使用make命令時沒有指定目標,則make工具默認會實現makefile文件內的第一個目 標 ,然后退出,指定了make工具要實現的目標,目標可以是一個或多個(多個目標間用空 格隔開)。

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 命令

3.1.2.1 使用make -f 命令執行默認make操作

程序:與3.1.1使用默認make命令一樣。

makefile:與3.1.1使用默認make命令一樣。僅名稱不同。

將可執行文件main刪除,Makefile復制一份,重命名為Makefile1,執行?make -f Makefile1

也可以正常執行make命令。執行結果與默認make命令結果相同

3.1.2.2使用 make [ ‐f file ] [ targets ]命令

程序:與3.1.1使用默認make命令一樣。

makefile:

test:main.c main.h gcc main.c -o main @echo "=== test ==="clean:rm main @echo "=== clean ==="test1:@echo "=== test1 ==="; # @符號注釋見下面 #echo前使用 @?:在 echo 前添加 @ 符號,可隱藏命令本身的輸出,僅顯示命令的執行結果?
#終端結果: === test1 ===#未使用 @?:命令本身和執行結果都會顯示,
#終端結果: echo "=== test1 ==="
# 		=== test1 ===
# 在 Makefile 中直接寫 @echo "注釋內容" # 注釋內容, 注釋內容會輸出在終端,
# 因為 # 必須出現在行首或通過 ; 分隔	
test2:@echo "=== test2 ==="; # @符號注釋見上面 

(1)執行??make -f Makefile2 test1 test test2

test1 test test2 為Makefile2中的三個目標文件,執行上述命令,先運行test1里面的運行命令,在運行test運行命令,最后運行test2運行命令。

運行結果:

(2)執行 make -f Makefile2 test1 test2 clean 命令

test1 test2 clean 為Makefile2中的三個目標文件,執行上述命令,先運行test1里面的運行命令,在運行test2運行命令,最后運行clean運行命令。

運行結果:

注意:保證執行 clean命令,確保刪除的文件要存在。

刪除文件不存在運行結果:

3.1.2.3使用 make [ ‐f file ] [ targets ]命令,并執行可執行程序

程序:與3.1.1使用默認make命令一樣。

makefile:

test:main.c main.h gcc main.c -o main @echo "=== test ==="clean:rm main @echo "=== clean ==="test1:@echo "=== test1 ==="; # @符號注釋見下面 #echo前使用 @?:在 echo 前添加 @ 符號,可隱藏命令本身的輸出,僅顯示命令的執行結果?
#終端結果: === test1 ===#未使用 @?:命令本身和執行結果都會顯示,
#終端結果: echo "=== test1 ==="
# 		=== test1 ===
# 在 Makefile 中直接寫 @echo "注釋內容" # 注釋內容, 注釋內容會輸出在終端,
# 因為 # 必須出現在行首或通過 ; 分隔	
test2:@echo "=== test2 ==="; # @符號注釋見上面 

(1)執行 make -f Makefile2 test1 test2 test;./main 命令

執行Makefile命令后,并運行生成的可執行文件

?(2)執行?make -f Makefile2 test;./main 命令

執行Makefile命令后,并運行生成的可執行文件

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最基礎、自定義變量、預定義變量對應關系。

每一行為幾種方法相同結果不同格式的變量表達式。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/78902.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/78902.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/78902.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

城市應急安防系統EasyCVR視頻融合平臺:如何實現多源視頻資源高效匯聚與應急指揮協同

一、方案背景 1&#xff09;項目背景 在當今數字化時代&#xff0c;隨著信息技術的飛速發展&#xff0c;視頻監控和應急指揮系統在公共安全、城市應急等領域的重要性日益凸顯。尤其是在關鍵場所&#xff0c;高效的視頻資源整合與傳輸能力對于應對突發公共事件、實現快速精準的…

雙Token實現用戶登錄身份認證-Java版

雙Token實現用戶登錄身份認證-Java版 1. 設計方案 方案概述: Access Token: 短期有效的JWT,包含用戶ID、設備ID、token版本號。Refresh Token: 長期有效的令牌,存儲于Redis,關聯用戶信息、設備ID及token版本號,用于刷新Access Token。設備綁定: Token與設備ID綁定,防止跨…

Proteus vs Multisim:電路設計與仿真軟件對比

Proteus和Multisim作為兩款主流的電路設計與仿真軟件&#xff0c;在功能定位和應用場景上既有重疊也有顯著差異。以下從多個維度綜合闡述兩者的異同點&#xff1a; 一、相同點 基礎功能 ? 電路原理圖設計&#xff1a;支持電路設計和仿真分析。 ?? 虛擬儀器&#xff1a;提供…

ssh 三級跳

ssh 三級跳 在網絡安全和數據傳輸領域&#xff0c;SSH&#xff08;Secure Shell&#xff09;是一種常用的協議&#xff0c;用于加密兩臺計算機之間的通信。在某些情況下&#xff0c;你可能需要通過一個中間服務器來間接連接到目標服務器&#xff0c;這通常被稱為“三級跳”或“…

Java 性能優化:從原理到實踐的全面指南

性能優化是 Java 開發中不可或缺的一環&#xff0c;尤其在高并發、大數據和分布式系統場景下&#xff0c;優化直接影響系統響應速度、資源利用率和用戶體驗。Java 作為一門成熟的語言&#xff0c;提供了豐富的工具和機制支持性能調優&#xff0c;但優化需要深入理解 JVM、并發模…

【土堆 PyTorch 教程總結】PyTorch入門

目錄 一、python學習中兩大法寶函數 1、dir() 2、help() 二、PyTorch讀取數據集 1、Dataset類 &#xff08;1&#xff09;作用和基本原理 &#xff08;2&#xff09;常見用法 &#xff08;3&#xff09;自定義 Dataset 示例 2、Dataloader類 &#xff08;1&#xff0…

5.DJI-PSDK:Psdk開發負載與Msdk的應用app進行交互:

DJI-PSDK:Psdk開發負載與Msdk的應用app進行交互: 負載設備和無人機使用數據傳輸模塊,在控制命令傳輸通道上以透傳的方式在PSDK和MSDK間傳輸控制指令。在高速數據傳輸通道上以透傳的方式在PSDK和MSDK間傳輸數據信息以及用戶自定義的數據。使用數據傳輸功能,不僅可以設置不同…

2025 藍橋杯省賽c++B組個人題解

聲明 本題解為退役蒻茍所寫&#xff0c;不保證正確性&#xff0c;僅供參考。 花了大概2個半小時寫完&#xff0c;感覺比去年省賽簡單&#xff0c;難度大概等價于 codeforces dv4.5 吧 菜雞不熟悉樹上背包&#xff0c;調了一個多小時 題目旁邊的是 cf 預測分 所有代碼均以通…

Dubbo(53)如何在Spring Boot中集成Dubbo?

在Spring Boot中集成Dubbo可以通過Spring Boot Starter來簡化配置&#xff0c;以下是詳細的步驟和相關代碼示例。 1. 引入依賴 首先&#xff0c;在Spring Boot項目的 pom.xml 中添加Dubbo相關的依賴&#xff1a; <dependencies><!-- Spring Boot Starter --><…

開發一個環保回收小程序需要哪些功能?環保回收小程序

廢品分類展示與識別 詳細分類列表&#xff1a;清晰展示常見廢品類型&#xff0c;如廢紙&#xff08;報紙、書本紙、包裝紙等&#xff09;、塑料&#xff08;塑料瓶、塑料容器、塑料薄膜等&#xff09;、金屬&#xff08;易拉罐、鐵制品、銅制品等&#xff09;、玻璃&#xff0…

抗干擾CAN總線通信技術在分布式電力系統中的應用

摘要&#xff1a;隨著分布式電力系統的廣泛應用&#xff0c;其通信系統的可靠性與穩定性受到了前所未有的挑戰。CAN總線通信技術以其卓越的抗干擾性能和可靠性&#xff0c;在眾多通信技術中脫穎而出&#xff0c;成為解決分布式電力系統通信問題的關鍵。本文深入剖析了CAN總線通…

MySQL與Oracle深度對比

MySQL與Oracle深度對比&#xff1a;數據類型與SQL差異 一、數據類型差異 1. 數值類型對比 數據類型MySQLOracle整數TINYINT, SMALLINT, MEDIUMINT, INT, BIGINTNUMBER(精度) 或直接INT(內部仍為NUMBER)小數DECIMAL(p,s), FLOAT, DOUBLENUMBER(p,s), FLOAT, BINARY_FLOAT, BI…

探索 Rust 語言:高效、安全與并發的完美融合

在當今的編程語言領域&#xff0c;Rust 正以其獨特的魅力吸引著越來越多開發者的目光。它誕生于 Mozilla 實驗室&#xff0c;旨在解決系統編程中長久以來存在的難題&#xff0c;如今已成為構建可靠、高效軟件的有力工具。 1 內存安全 Rust 通過所有權&#xff08;ownership&a…

springboot框架集成websocket依賴實現物聯網設備、前端網頁實時通信!

需求&#xff1a; 最近在對接一個物聯網里設備&#xff0c;他的通信方式是 websocket 。所以我需要在 springboot框架中集成websocket 依賴&#xff0c;從而實現與設備實時通信&#xff01; 框架&#xff1a;springboot2.7 java版本&#xff1a;java8 好了&#xff0c;還是直接…

第八天 開始Unity Shader的學習之Blinn-Phong光照模型

Unity Shader的學習筆記 第八天 開始Unity Shader的學習之Blinn-Phong光照模型 文章目錄 Unity Shader的學習筆記前言一、Blinn-Phong光照模型①計算高光反射部分效果展示 二、召喚神龍:使用Unity內置的函數總結 前言 今天我們編寫另一種高光反射的實現方法 – Blinn光照模型…

React八案例上

代碼下載 技術棧&#xff1a; React 核心庫&#xff1a;react、react-dom、react-router-dom腳手架&#xff1a;create-react-app數據請求&#xff1a;axiosUI組件庫&#xff1a; antd-mobile其他組件庫&#xff1a; react-virtualized、formikyup、react-spring 等百度地圖A…

線代[13]|線性代數題37道以及數學分析題3道(多圖預警)

博主首次發布于CSDN&#xff0c;禁止轉載&#xff01;&#xff08;CSDN&#xff1a;漢密士2025&#xff09; 文章目錄 一、緣起&#xff5c;《俗說矩陣》課程目錄照片存檔&#xff5c;線性代數學習脈絡&#xff5c;線代習題集封面存檔&#xff5c;未來——我與線性代數的糾纏 二…

OpenCV 圖形API(24)圖像濾波-----雙邊濾波函數bilateralFilter()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 應用雙邊濾波到圖像。 該函數對輸入圖像應用雙邊濾波&#xff0c;如 http://www.dai.ed.ac.uk/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Fil…

AI與5G的融合:如何實現更快速、更智能的物聯網應用?

引言 AI和5G的結合&#xff0c;正在加速物聯網&#xff08;IoT&#xff09;應用的發展&#xff0c;讓萬物互聯變得更加智能、高效。5G提供超高速率、低時延和海量連接的網絡能力&#xff0c;而AI則賦予物聯網設備更強的數據分析、預測和自動決策能力。當AI與5G融合&#xff0c;…

在ArcGIS Pro中將柵格NoData值修改為特定值

目錄 問題如下&#xff1a;柵格文件中NoData值為65535&#xff0c;要將該NoData值修改為-9999 步驟一&#xff1a;使用柵格計算器&#xff08;Raster Calculator&#xff09;輸出具有新NoData值的柵格文件 步驟二&#xff1a;輸出修改值后的柵格文件&#xff08;Export Rast…