通俗理解-L、-rpath和-rpath-link編譯鏈接動態庫

一、參考資料

鏈接選項 rpath 的應用和原理 | BewareMyPower的博客

使用 rpath 和 rpath-link 確保 samba-util 庫正確鏈接-CSDN博客

編譯參數-Wl和rpath的理解_-wl,-rpath-CSDN博客

Using LD, the GNU linker - Options

Directory Options (Using the GNU Compiler Collection (GCC))

交叉編譯時–sysroot,-rpath,-rpath-link,-L之間的關系與注意點_交叉編譯 sysroot-CSDN博客

二、相關介紹

Linux 動態庫查找路徑

一個典型的 C/C++ 程序的構建流程是:預處理,匯編,編譯,鏈接。而執行鏈接的程序其實是 ld,通常編譯器比如 GCC 都會自動調用 ld 去進行鏈接,用戶不必關注其中的細節。而 ld 查找動態庫的順序是:

  1. rpath 指定的目錄;
  2. 環境變量 LD_LIBRARY_PATH 指定的目錄;
  3. runpath 指定的目錄;
  4. /etc/ld.so.cache 緩存文件,通常包含 /etc/ld.so.conf 文件編譯出的二進制倆別哦(比如 CentOS 上,該文件會使用 include 從而使用 ld.so.conf.d 目錄下面所有的 *.conf 文件,這些都會緩存在 ld.so.cache 中)
  5. 系統默認路徑,比如 /lib/usr/lib

在編譯時若使用 -z nodefaultlib 選項編譯,則會跳過 4 和 5。至于 runpath,和 rpath 類似,都是二進制(ELF)文件的動態 section 屬性(分別為 DT_RUNPATHDT_RPATH),唯一區別就是是否優先于 LD_LIBRARY_PATH 來查找。

rpath vs. runpathrpathrunpath 是嵌入在可執行文件或共享庫中的路徑列表,用于指定運行時查找共享庫的位置。rpath 是舊標準,runpath 是新標準,功能類似但優先級不同。

-Wl參數

gcc的-Wl,xxx選項將逗號分隔的標記列表(flags)作為空格分隔的參數列表傳遞給鏈接器,即:

gcc -Wl,aaa,bbb,ccc

最終變成了linker的用法:

ld aaa bbb ccc

如果是想把ld -rpath通過-Wl傳遞給gcc,可以是-Wl,-rpath,xxx,也可以指定-Wl的重復實例:

gcc -Wl,aaa -Wl,bbb -Wl,ccc

類似的參數還有:

-Wa,<options>   Pass comma-separated <options> on to the assembler
-Wp,<options>   Pass comma-separated <options> on to the preprocessor
-Wl,<options>   Pass comma-separated <options> on to the linker 

--sysroot 選項

--sysroot = dir 將dir作為邏輯root目錄,用于搜索頭文件和依賴庫文件,例如 --sysroot=/home/build,那么如果之前默認去 /usr/lib下面去搜索依賴庫,則在sysroot的作用下會定位到 /home/build/usr/lib 目錄下進行搜索。這個參數在交叉編譯的時候會影響到rpath,如果沒有設置這個sysroot,則rpath在編譯階段是不起作用的。

在交叉編譯工具中,有默認的 sysroot 路徑。

# 設置交叉編譯工具鏈的環境變量
export PATH=/home/yoyo/360Downloads/toolchains/arm-linux-gnueabihf/bin:$PATH# 查看交叉編譯工具鏈的 sysroot 路徑
arm-linux-gnueabihf-gcc -print-sysroot

輸出示例:

yoyo@yoyo:~$ arm-linux-gnueabihf-gcc -print-sysroot
/home/yoyo/360Downloads/toolchains/arm-linux-gnueabihf/bin/../arm-linux-gnueabihf/libc

$ORIGIN 變量

關于Linux上的$ORIGIN解說

關于Linux上的$ORIGIN解說

許多現代C / C ++項目都利用 Autotools 創建GNU構建系統,例如根據平臺生成make文件。 可執行文件(二進制文件)在生成/編譯過程中生成,并且可以在執行編譯的計算機上本地執行。 但是,如果將同一可執行文件移動到另一臺計算機上,或者只是移到同一臺計算機上的其他文件夾,則在運行該可執行文件時可能會遇到“找不到庫”錯誤。因此,引入一個特殊的環境變量 $ORIGIN

在Linux系統中,$ORIGIN 是一個特殊的環境變量,表示可執行文件或共享庫所在的目錄。使用 $ORIGIN 可以指定相對于可執行文件或共享庫的路徑,確保程序在不同目錄中運行時能正確找到依賴庫。

使用 $ORIGIN 的好處在于,它允許可移植性更高的應用程序部署,因為這意味著應用程序和它的依賴庫可以被放置在文件系統中的任意位置,并且在運行時動態鏈接器仍然能正確找到它們,只要維持相對結構不變即可。

簡單示例:假設有一個可執行文件 /app/bin/myprogram,依賴庫在 /app/lib 中。可以在編譯時設置 RPATHRUNPATH$ORIGIN/../lib,這樣程序運行時會在 /app/lib 中查找依賴庫。

/app/myprogram.cbin/applib/libdependency.so

在鏈接 app 時,可以使用:

gcc -Wl,-rpath,'$ORIGIN/../x264/lib' -Wl,rpath,'$ORIGIN/../x265/lib' -o app myprogram.c
-Wl,-rpath,'$ORIGIN'

如果需要設置多個路徑,可以將它們用空格分隔,并確保每個路徑前都有 -Wl,-rpath,

-Wl,-rpath,'$ORIGIN/../third_party/arm_opencv/3rdparty/zlib/lib' \
-Wl,-rpath,'$ORIGIN/../third_party/arm_opencv/3rdparty/szlib/lib'

這樣,不管 /usr/appdir/ 復制到文件系統的哪個地方,執行 app 時,libdependency.so 都會從執行文件所在目錄下的 lib 目錄中被找到和加載。

在處理諸如需要將應用打包到一個單一文件夾以實現便攜式部署的情況下,$ORIGIN 變量異常有用。使用 $ORIGIN ,開發者便無需擔心程序部署后動態鏈接庫的路徑問題,從而大大提高了軟件的移植性和靈活性。

注意事項

  • $ORIGIN 必須用引號括起來,防止被 shell 解釋。
  • 使用 $ORIGIN 時,確保路徑設置正確,避免運行時找不到庫。
  • Makefile 或其他文件中直接使用時,只用一個 $ 會展開成變量值,通常需要寫作 $$ORIGIN來避免變量擴展。

三、-L、-rpath-link和-rpath

通過使用 rpathrpath-link,可以確保程序在運行時正確找到依賴的庫。這對于處理不在系統默認路徑下的庫非常有用。在編譯和鏈接時正確使用這兩個選項可以確保你的程序在不同環境中都能正常運行。

引言

現代連接器在處理動態庫時將鏈接時路徑(Link-time path)運行時路徑(Run-time path) 分開,用戶可以通過 -L指定連接時庫的路徑,通過-R(或-rpath)指定程序運行時庫的路徑,大大提高了庫應用的靈活性。

-rpath-rpath-link之間的區別:-rpath選項指定的目錄被包含在可執行文件中并在運行時使用,而-rpath-link選項僅在鏈接時有效。

通過測試發現,-Wl,-rpath下面這三種寫法都是可以的:

-Wl,-rpath -Wl,/usr/lib/gstreamer-1.0
-Wl,-rpath,/usr/lib/gstreamer-1.0
-Wl,-rpath=/usr/lib/gstreamer-1.0

-l 選項

功能:添加需要鏈接的庫文件,如果沒有后綴指明動態庫還是靜態庫,則優先使用動態庫。

-L選項(編譯時路徑)

功能:-L 指定的是編譯時鏈接的動態庫搜索路徑。

編譯時-L選項并不影響環境變量 LD_LIBRARY_PATH,只是指定了程序編譯連接時庫的路徑,并不影響程序執行時庫的路徑。當程序運行時,系統還是會到默認路徑下查找該程序所需要的庫,如果找不到,會出現類似 cannot open shared object file 的錯誤。

-L/mylib -lmylib

-Wl,-rpath選項(運行時路徑)

功能:-Wl,-rpath 用于指定動態庫的搜索路徑(在運行階段),該路徑會被記錄在elf可執行文件中。

-rpath 的作用相當于在程序運行時設置了 LD_LIBRARY_PATH 環境變量,因為 -rpath指定的路徑會被記錄在生成的可執行程序中,用于運行時查找需要加載的動態庫 。因此,在開發板中無需設置環境變量即可找到相關的動態庫。通常情況下,推薦使用 -Wl,-rpath 選項。

# 單個路徑
-L/mylib -lmylib -Wl,-rpath=dir# 多個路徑
-L/mylib -lmylib -Wl,-rpath,dir1:dir2:...:dirN

在cmake中使用:

# 設置第三方庫路徑
set(3RDPARTY_DIR "${PARENT_DIR}/third_party")# 設置目標屬性,將運行時庫搜索路徑添加到目標
set_target_properties(dla_detectPROPERTIESLINK_FLAGS"-L${3RDPARTY_DIR}/zlib/lib -Wl,-rpath,'$ORIGIN/../../third_party/zlib/lib' \-L${3RDPARTY_DIR}/szlib/lib -Wl,-rpath,'$ORIGIN/../../third_party/szlib/lib' \-L${3RDPARTY_DIR}/hdf5/lib -Wl,-rpath,'$ORIGIN/../../third_party/hdf5/lib' \-L${3RDPARTY_DIR}/x264/lib -Wl,-rpath,'$ORIGIN/../../third_party/x264/lib' \-L${3RDPARTY_DIR}/x265/lib -Wl,-rpath,'$ORIGIN/../../third_party/x265/lib' \-L${3RDPARTY_DIR}/ffmpeg/lib -Wl,-rpath,'$ORIGIN/../../third_party/ffmpeg/lib' \-L${3RDPARTY_DIR}/sigmastar/lib -Wl,-rpath,'$ORIGIN}/../../third_party/sigmastar/lib' \-L${3RDPARTY_DIR}/arm_opencv/lib -Wl,-rpath,'$ORIGIN/../../third_party/arm_opencv/lib' \-L${PARENT_DIR}/build -Wl,-rpath,'$ORIGIN/../../build'"
)

或者:

# 設置第三方庫路徑
set(3RDPARTY_DIR "${PARENT_DIR}/third_party")# 設置rpath
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} \
-L${3RDPARTY_DIR}/zlib/lib -Wl,-rpath,'$ORIGIN/../../third_party/zlib/lib' \
-L${3RDPARTY_DIR}/szlib/lib -Wl,-rpath,'$ORIGIN/../../third_party/szlib/lib' \
-L${3RDPARTY_DIR}/hdf5/lib -Wl,-rpath,'$ORIGIN/../../third_party/hdf5/lib' \
-L${3RDPARTY_DIR}/x264/lib -Wl,-rpath,'$ORIGIN/../../third_party/x264/lib' \
-L${3RDPARTY_DIR}/x265/lib -Wl,-rpath,'$ORIGIN/../../third_party/x265/lib' \
-L${3RDPARTY_DIR}/ffmpeg/lib -Wl,-rpath,'$ORIGIN/../../third_party/ffmpeg/lib' \
-L${3RDPARTY_DIR}/sigmastar/lib -Wl,-rpath,'$ORIGIN/../../third_party/sigmastar/lib' \
-L${3RDPARTY_DIR}/arm_opencv/lib -Wl,-rpath,'$ORIGIN/../../third_party/arm_opencv/lib' \
-L${PARENT_DIR}/build -lsigmastar_vVehicle_det -Wl,-rpath,'$ORIGIN/../../build'")

編譯之后,查看rpath:

yoyo@yoyo:~/share/driver/dla_detect$ readelf -d test/build/dla_detect
...
0x0000000f (RPATH)                      Library rpath: [$ORIGIN/../../third_party/zlib/lib:$ORIGIN/../../third_party/szlib/lib:$ORIGIN/../../third_party/hdf5/lib:$ORIGIN/../../third_party/x264/lib:$ORIGIN/../../third_party/x265/lib:$ORIGIN/../../third_party/ffmpeg/lib:$ORIGIN/../../third_party/sigmastar/lib:$ORIGIN/../../third_party/arm_opencv/lib:$ORIGIN/../../build:/home/yoyo/share/driver/dla_detect/third_party/arm_opencv/share/opencv4/../../lib]
...

-Wl,-rpath-link選項(運行時路徑)

功能:-Wl,-rpath-link 用于指定動態庫的搜索路徑(在鏈接階段),該選項只在鏈接階段起作用,不會被寫入elf文件中。

-L/mylib -lmylib -Wl,-rpath-link=<library_path>

在cmake中使用:

# 設置第三方庫路徑
set(3RDPARTY_DIR "${PARENT_DIR}/third_party")# 設置目標屬性,將運行時庫搜索路徑添加到目標
set_target_properties(dla_detectPROPERTIESLINK_FLAGS"-L${3RDPARTY_DIR}/zlib/lib -Wl,-rpath-link,'$ORIGIN/../../third_party/zlib/lib' \-L${3RDPARTY_DIR}/szlib/lib -Wl,-rpath-link,'$ORIGIN/../../third_party/szlib/lib' \-L${3RDPARTY_DIR}/hdf5/lib -Wl,-rpath-link,'$ORIGIN/../../third_party/hdf5/lib' \-L${3RDPARTY_DIR}/x264/lib -Wl,-rpath-link,'$ORIGIN/../../third_party/x264/lib' \-L${3RDPARTY_DIR}/x265/lib -Wl,-rpath-link,'$ORIGIN/../../third_party/x265/lib' \-L${3RDPARTY_DIR}/ffmpeg/lib -Wl,-rpath-link,'$ORIGIN/../../third_party/ffmpeg/lib' \-L${3RDPARTY_DIR}/sigmastar/lib -Wl,-rpath-link,'$ORIGIN}/../../third_party/sigmastar/lib' \-L${3RDPARTY_DIR}/arm_opencv/lib -Wl,-rpath,'$ORIGIN/../../third_party/arm_opencv/lib' \-L${PARENT_DIR}/build -Wl,-rpath-link,'$ORIGIN/../../build'"
)

或者:

# 設置第三方庫路徑
set(3RDPARTY_DIR "${PARENT_DIR}/third_party")# 設置rpath
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} \
-L${3RDPARTY_DIR}/zlib/lib -Wl,-rpath-link,'$ORIGIN/../../third_party/zlib/lib' \
-L${3RDPARTY_DIR}/szlib/lib -Wl,-rpath-link,'$ORIGIN/../../third_party/szlib/lib' \
-L${3RDPARTY_DIR}/hdf5/lib -Wl,-rpath-link,'$ORIGIN/../../third_party/hdf5/lib' \
-L${3RDPARTY_DIR}/x264/lib -Wl,-rpath-link,'$ORIGIN/../../third_party/x264/lib' \
-L${3RDPARTY_DIR}/x265/lib -Wl,-rpath-link,'$ORIGIN/../../third_party/x265/lib' \
-L${3RDPARTY_DIR}/ffmpeg/lib -Wl,-rpath-link,'$ORIGIN/../../third_party/ffmpeg/lib' \
-L${3RDPARTY_DIR}/sigmastar/lib -Wl,-rpath-link,'$ORIGIN/../../third_party/sigmastar/lib' \
-L${3RDPARTY_DIR}/arm_opencv/lib -Wl,-rpath-link,'$ORIGIN/../../third_party/arm_opencv/lib' \
-L${PARENT_DIR}/build -lsigmastar_vVehicle_det -Wl,-rpath-link,'$ORIGIN/../../build'")

編譯之后,查看二進制的 rpath

yoyo@yoyo:~/share/driver/dla_detect$ readelf -d test/build/dla_detect
...
0x0000000f (RPATH)                      Library rpath: [/home/yoyo/share/driver/dla_detect/third_party/arm_opencv/share/opencv4/../../lib]
...

查看 rpath

objdump -x path/to/executable | grep RPATH
readelf -d path/to/executable | head -20
chrpath -l path/to/executable

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

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

相關文章

SpringMVC環境搭建

文章目錄 1.模塊創建1.創建一個webapp的maven項目2.目錄結構 2.代碼1.HomeController.java2.home.jsp3.applicationContext.xml Spring配置文件4.spring-mvc.xml SpringMVC配置文件5.web.xml 配置中央控制器以及Spring和SpringMVC配置文件的路徑6.index.jsp 3.配置Tomcat1.配置…

window中git bash使用conda命令

window系統的終端cmd和linux不一樣&#xff0c;運行不了.sh文件&#xff0c;為了在window中模仿linux&#xff0c;可以使用gui bash模擬linux的終端。為了在gui bash中使用python環境&#xff0c;由于python環境是在anaconda中創建的&#xff0c;所以需要在gui bash使用conda命…

在線考試系統(代碼+數據庫+LW)

摘 要 使用舊方法對在線考試系統的信息進行系統化管理已經不再讓人們信賴了&#xff0c;把現在的網絡信息技術運用在在線考試系統的管理上面可以解決許多信息管理上面的難題&#xff0c;比如處理數據時間很長&#xff0c;數據存在錯誤不能及時糾正等問題。這次開發的在線考試…

c/c++藍橋杯經典編程題100道(19)漢諾塔問題

漢諾塔問題 ->返回c/c藍橋杯經典編程題100道-目錄 目錄 漢諾塔問題 一、題型解釋 二、例題問題描述 三、C語言實現 解法1&#xff1a;遞歸法&#xff08;難度★&#xff09; 解法2&#xff1a;迭代法&#xff08;難度★★★&#xff09; 四、C實現 解法1&#xff1…

趕AI大潮:在VSCode中使用DeepSeek及近百種模型的極簡方法

1 趕AI大潮&#xff1a;在VSCode中使用DeepSeek及近百種模型的極簡方法 1.1 背景 DeepSeek在春節期間突然大行其道&#xff0c;欣喜國力大增的同時&#xff0c;對于普通IT工作者&#xff0c;如何才能享受這一波AI紅利&#xff0c;讓自己的工作更出彩呢&#xff1f; ??很多人…

【一文讀懂】HTTP與Websocket協議

HTTP協議 概述 HTTP (Hypertext Transfer Protocol)&#xff0c;即超文本傳輸協議&#xff0c;是一種用于在客戶端和服務器之間傳輸超文本&#xff08;例如網頁、圖片、音頻、視頻等&#xff09;的通信協議。它是萬維網&#xff08;WWW&#xff09;的基礎&#xff0c;負責在瀏…

IDEA集成DeepSeek

引言 隨著數據量的爆炸式增長&#xff0c;傳統搜索技術已無法滿足用戶對精準、高效搜索的需求。 DeepSeek作為新一代智能搜索技術&#xff0c;憑借其強大的語義理解與深度學習能力&#xff0c;正在改變搜索領域的游戲規則。 對于 Java 開發者而言&#xff0c;將 DeepSeek 集成…

從零開始部署DeepSeek:基于Ollama+Flask的本地化AI對話系統

從零開始部署DeepSeek&#xff1a;基于OllamaFlask的本地化AI對話系統 一、部署背景與工具選型 在AI大模型遍地開花的2025年&#xff0c;DeepSeek R1憑借其出色的推理能力和開源特性成為開發者首選。本文將以零基礎視角&#xff0c;通過以下工具鏈實現本地化部署&#xff1a; …

圖論入門算法:拓撲排序(C++)

上文中我們了解了圖的遍歷(DFS/BFS), 本節我們來學習拓撲排序. 在圖論中, 拓撲排序(Topological Sorting)是對一個有向無環圖(Directed Acyclic Graph, DAG)的所有頂點進行排序的一種算法, 使得如果存在一條從頂點 u 到頂點 v 的有向邊 (u, v) , 那么在排序后的序列中, u 一定…

第1章大型互聯網公司的基礎架構——1.2 客戶端連接機房的技術1:DNS

客戶端啟動時要做的第一件事情就是通過互聯網與機房建立連接&#xff0c;然后用戶才可以在客戶端與后臺服務器進行網絡通信。目前在計算機網絡中應用較為廣泛的網絡通信協議是TCP/IP&#xff0c;它的通信基礎是IP地址&#xff0c;因為IP地址有如下兩個主要功能。 標識設備&…

全面解析鴻蒙(HarmonyOS)開發:從入門到實戰,構建萬物互聯新時代

文章目錄 引言 一、鴻蒙操作系統概述二、鴻蒙開發環境搭建三、鴻蒙核心開發技術1. **ArkUI框架**2. **分布式能力開發**3. **原子化服務與元服務** 四、實戰案例&#xff1a;構建分布式音樂播放器五、鴻蒙開發工具與調試技巧六、鴻蒙生態與未來展望結語 引言 隨著萬物互聯時代…

Android:播放Rtsp視頻流的兩種方式

一.SurfaceView Mediaplayer XML中添加SurfaceView: <SurfaceViewandroid:id"id/surface_view"android:layout_width"match_parent"android:layout_height"match_parent"/> Activity代碼&#xff1a; package com.android.rtsp;impor…

Next.js【詳解】CSS 樣式方案

全局樣式 Global CSS 默認已創建&#xff0c;即 src\app\globals.css&#xff0c;可根據需要修改 默認在全局布局中導入 src\app\layout.tsx import "./globals.css";組件樣式 CSS Modules 新建文件 src\app\test\styles.module.css .red {color: red;}導入目標頁面…

LVS相關原理

一、LVS集群的體系結構 1.1 LVS簡介 LVS 是 Linux Virtual Server 的簡稱&#xff0c;也就是 Linux 虛擬服務器 , 是一個由章文嵩博士發起的自由軟件項目&#xff0c;它的官方站點是 www.linuxvirtualserver.org 。現在 LVS 已經是 Linux標準內核的一部分&#xff0c;在Linux2…

【2025深度學習系列專欄大綱:深入探索與實踐深度學習】

第一部分:深度學習基礎篇 第1章:深度學習概覽 1.1 深度學習的歷史背景與發展軌跡 1.2 深度學習與機器學習、傳統人工智能的區別與聯系 1.3 深度學習的核心組件與概念解析 神經網絡基礎 激活函數的作用與類型 損失函數與優化算法的選擇 1.4 深度學習框架簡介與選擇建議 第2…

Java與C語言中取模運算符%的區別對比

博客主頁&#xff1a; [小????????] 本文專欄: Java 文章目錄 &#x1f4af;前言&#x1f4af;C語言中的取模運算符 %基本行為示例 注意事項示例&#xff1a;負數取模 &#x1f4af;Java中的取模運算符 %基本行為示例 對浮點數的支持示例&#xff1a;浮點數取模 符…

OpenCV機器學習(4)k-近鄰算法(k-Nearest Neighbors, KNN)cv::ml::KNearest類

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 cv::ml::KNearest 是 OpenCV 機器學習模塊中的一部分&#xff0c;它提供了實現 k-近鄰算法&#xff08;k-Nearest Neighbors, KNN&#xff09;的…

過于依賴chatgpt編程會有哪些弊端?

過于依賴ChatGPT編程可能會帶來以下問題&#xff1a; 1. 基礎不扎實&#xff0c;容易“變菜” 以前遇到代碼還會琢磨哪里不懂、怎么改&#xff0c;現在直接復制粘貼&#xff0c;時間長了可能連基本的語法和邏輯都搞不清楚。就像考試總抄答案&#xff0c;真讓你自己寫的時候腦子…

紅隊視角出發的k8s敏感信息收集——Kubernetes API 擴展與未授權訪問

針對 Kubernetes 第三方組件與 Operator 的詳細攻擊視角分析&#xff0c;涵蓋 Service Mesh、Helm Releases 和 Database Operators 的潛在風險及利用方法。 攻擊鏈示例 1. 攻擊者通過未授權的 Tiller 服務部署惡意 Helm Chart → 2. 創建后門 Pod 并橫向移動至 Istio 控制平…

3D與2D機器視覺機械臂引導的區別

3D與2D機器視覺在機械臂引導中的主要區別如下&#xff1a; 數據維度 2D視覺&#xff1a;僅處理平面圖像&#xff0c;提供X、Y坐標信息&#xff0c;無法獲取深度&#xff08;Z軸&#xff09;數據。 3D視覺&#xff1a;處理三維空間數據&#xff0c;提供X、Y、Z坐標及物體的姿態…