Qt .pro配置gcc相關命令(三):-W1、-L、-rpath和-rpath-link

目錄

1.Linux 動態庫相關知識

1.1.動態庫查找路徑

1.2.查看程序依賴的動態庫

1.3.修改動態庫查找路徑的方法

1.4.動態鏈接器緩存管理

2.-Wl參數

3.-L選項(編譯時路徑)

4.-rpath參數(運行時路徑)

5.-rpath-link?參數

6.常見問題與解決方案

7.總結


????????在 Linux 系統中編譯和鏈接動態庫時,-L-rpath-rpath-link是三個非常重要的參數,它們分別解決了動態庫編譯、鏈接和運行時的不同問題。

1.Linux 動態庫相關知識

1.1.動態庫查找路徑

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

? 1.程序本身指定的路徑, 即是rpath或?runpath指定的目錄;

  • RPATH:硬編碼在 ELF 文件中,優先級最高。
  • RUNPATH:與?RPATH?類似,但優先級低于?LD_LIBRARY_PATH

? ? ?2.環境變量?LD_LIBRARY_PATH?指定的目錄;

  • 用戶自定義的臨時路徑,多個路徑用冒號?:?分隔。
  • 例如:export LD_LIBRARY_PATH=/path/to/lib:$LD_LIBRARY_PATH

? ? ?3.runpath?指定的目錄;

? 4./etc/ld.so.cache緩存文件,通常包含?/etc/ld.so.conf?文件編譯出的二進制(比如 CentOS 上,該文件會使用 include 從而使用?ld.so.conf.d?目錄下面所有的?*.conf?文件,這些都會緩存在 ld.so.cache 中)

  • 這些文件中指定的路徑會被動態鏈接器緩存(通過?ldconfig?命令更新)。

? ? ?5.系統默認路徑,比如?/lib/usr/lib

  • /lib:系統核心庫(如?libc.so)。
  • /usr/lib:用戶級庫。
  • /usr/local/lib:本地安裝的庫(如自行編譯的軟件)。

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

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

1.2.查看程序依賴的動態庫

1.ldd?命令

ldd /path/to/program  # 顯示程序依賴的所有動態庫及其路徑
  • 若某庫顯示為?not found,表示系統未找到該庫。

2.readelf?命令

readelf -d /path/to/program | grep -E '(RPATH|RUNPATH|NEEDED)'

輸出示例:

0x000000000000000f (RPATH)              Library rpath: [/path/to/lib]
0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]

1.3.修改動態庫查找路徑的方法

1.臨時修改:通過?LD_LIBRARY_PATH?環境變量

export LD_LIBRARY_PATH=/path/to/lib:$LD_LIBRARY_PATH  # 當前終端生效
# 或添加到 ~/.bashrc 中使其永久生效
echo 'export LD_LIBRARY_PATH=/path/to/lib:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc

2.永久修改:編輯?/etc/ld.so.conf?或添加新配置

# 方法1:直接編輯主配置文件
sudo vim /etc/ld.so.conf
# 添加一行:/path/to/lib
# 保存后更新緩存
sudo ldconfig# 方法2:在 /etc/ld.so.conf.d/ 目錄下創建新配置文件
sudo touch /etc/ld.so.conf.d/myapp.conf
sudo echo '/path/to/lib' > /etc/ld.so.conf.d/myapp.conf
sudo ldconfig  # 更新緩存

3.編譯時指定:通過?-Wl,-rpath?選項

在編譯程序時,使用?-Wl,-rpath?將路徑硬編碼到程序中:

gcc -o myapp myapp.c -L/path/to/lib -lmylib -Wl,-rpath,/path/to/lib
  • 優點:無需修改系統配置或環境變量。
  • 缺點:路徑被固定,若庫位置改變需重新編譯。

1.4.動態鏈接器緩存管理

1.更新緩存

當添加新庫或修改?/etc/ld.so.conf?后,需執行:

sudo ldconfig  # 重建動態鏈接器緩存

2.查看緩存內容

ldconfig -p  # 顯示當前緩存的所有庫及其路徑

2.-Wl參數

????????在 Linux 系統中,-Wl?是 GCC 編譯器的一個重要參數,用于向鏈接器(如?ld)傳遞額外選項。由于 GCC 是編譯和鏈接的前端工具,真正處理鏈接過程的是鏈接器,因此需要通過?-Wl?將參數傳遞給鏈接器。

????????基本語法

gcc [編譯選項] -Wl,鏈接器選項1[,鏈接器選項2,...] [源文件]

將逗號分隔的選項傳遞給鏈接器。如:

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 

3.-L選項(編譯時路徑)

  • 編譯時:指定鏈接器搜索庫文件的路徑。
  • 僅影響鏈接過程,不影響程序運行時的庫查找。

假設你有一個自定義庫?libmath.so?位于?/opt/mylibs?目錄下:

g++ main.cpp -L/opt/mylibs -lmath -o myapp
  • -L/opt/mylibs:告訴鏈接器在?/opt/mylibs?目錄下搜索?libmath.so
  • -lmath:鏈接名為?libmath.so?的庫。

-L一般用于鏈接非標準位置的第三方庫(如?/usr/local/lib?以外的路徑)。

4.-rpath參數(運行時路徑)

????????運行時搜索路徑,將動態庫搜索路徑硬編碼到可執行文件中(運行時生效)。通過修改可執行文件的?.dynamic?段,將路徑硬編碼到二進制文件中。

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

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

? ? ? ? 示例:

g++ main.cpp -L/opt/mylibs -lmath -Wl,-rpath=/opt/mylibs -o myapp
  • -Wl,-rpath=/opt/mylibs:將?/opt/mylibs?添加到程序運行時的庫搜索路徑。

等價寫法

# 直接使用鏈接器參數
g++ main.cpp -L/opt/mylibs -lmath -Wl,-rpath=/opt/mylibs -o myapp# 或使用環境變量
export LDFLAGS="-Wl,-rpath=/opt/mylibs"
g++ main.cpp -L/opt/mylibs -lmath $LDFLAGS -o myapp

特殊變量

$ORIGIN:表示可執行文件所在目錄,常用于相對路徑。

# 搜索與可執行文件同級的 lib 目錄
-Wl,-rpath='$ORIGIN/../lib'

注意:在 Makefile 或 shell 腳本中使用時,需用雙引號防止變量提前展開:

-Wl,-rpath="\$$ORIGIN/../lib"

在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'")

5.-rpath-link?參數

????????用于指定動態庫的搜索路徑(在鏈接階段),該選項只在鏈接階段起作用,不會被寫入elf文件中。輔助鏈接器解析庫之間的依賴關系,但不影響程序運行時的庫搜索路徑。適用于復雜的庫依賴鏈(如 A 依賴 B,B 依賴 C)。

? ? ? ? 示例:假設:

  • libapp.so?依賴?libmath.so
  • libmath.so?依賴?libutils.so(位于?/opt/thirdparty)。
# 鏈接 libapp.so 時指定 libmath.so 的依賴路徑
g++ -shared -fPIC app.cpp -L/opt/mylibs -lmath -Wl,-rpath-link=/opt/thirdparty -o libapp.so
  • -Wl,-rpath-link=/opt/thirdparty:告訴鏈接器,libmath.so?依賴的?libutils.so?在?/opt/thirdparty?目錄下。
  • 但程序運行時,仍需通過?-rpath?或環境變量指定?/opt/thirdparty

在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?的區別

  • -rpath:同時影響鏈接和運行時的庫搜索。
  • -rpath-link:僅在鏈接時生效,不修改可執行文件的運行時路徑。

三者對比

參數生效階段是否影響運行時作用
-L鏈接時指定鏈接器搜索庫的路徑
-rpath運行時修改程序運行時的庫搜索路徑(硬編碼到二進制文件)
-rpath-link鏈接時輔助鏈接器解析庫依賴關系,但不影響程序運行時的搜索路徑

6.常見問題與解決方案

1.錯誤:libxxx.so: cannot open shared object file: No such file or directory

  • 可能原因
    • 庫未安裝。
    • 庫路徑未包含在查找路徑中。
  • 解決方案
# 1. 確認庫是否存在
find / -name "libxxx.so*" 2>/dev/null# 2. 若存在,將路徑添加到 LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/path/to/lib:$LD_LIBRARY_PATH# 3. 或添加到系統配置
echo '/path/to/lib' | sudo tee -a /etc/ld.so.conf
sudo ldconfig

2.區分?RPATH?和?RUNPATH

  • RPATH:在?RUNPATH?和?LD_LIBRARY_PATH?之前被搜索。
  • RUNPATH:在?LD_LIBRARY_PATH?之后被搜索。

修改方法

# 編譯時指定 RPATH
gcc -Wl,-rpath,/path/to/lib ...# 編譯時指定 RUNPATH(需顯式使用 -rpath-link)
gcc -Wl,-rpath-link,/path/to/lib -Wl,-rpath,'$ORIGIN/../lib' ...
  • $ORIGIN?表示程序所在目錄,用于相對路徑。

3.鏈接時提示找不到庫的依賴

/usr/bin/ld: libmath.so: undefined reference to `function_in_libutils'

原因

  • libmath.so?依賴?libutils.so,但鏈接器找不到?libutils.so

解決方案

# 臨時指定依賴路徑
g++ -shared -fPIC app.cpp -L/opt/mylibs -lmath -Wl,-rpath-link=/opt/thirdparty -o libapp.so

7.總結

  1. 優先使用?-rpath:減少對環境變量的依賴,提高程序可移植性。
  2. 使用?$ORIGIN:讓庫路徑相對于可執行文件,避免硬編碼絕對路徑。
  3. 謹慎使用?-rpath-link:僅在鏈接復雜依賴的庫時使用,避免污染運行時路徑。
  4. 測試部署:確保程序在目標環境中能正常找到庫(如使用?ldd myapp?檢查)。

通過合理組合?-L-rpath?和?-rpath-link,可以靈活控制動態庫的編譯、鏈接和運行時行為,解決復雜的依賴問題。

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

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

相關文章

Hoppscotch

官方地址 xixiaxiazxiaxix下載 ? Hoppscotch Hoppscotch 是一款輕量級、基于 Web 的 API 開發套件&#xff0c;其核心功能和特點如下&#xff1a; 核心功能3 交互式 API 測試&#xff1a;允許用戶實時發送請求并查看響應&#xff0c;方便記錄 API 行為&#xff0c;在記錄響…

RabbitMQ 知識詳解(Java版)

RabbitMQ 知識詳解&#xff08;Java版&#xff09; RabbitMQ 是一個開源的消息代理&#xff0c;實現了高級消息隊列協議&#xff08;AMQP&#xff09;。它用于在分布式系統中實現應用解耦、異步通信和流量削峰。 核心概念 生產者(Producer)&#xff1a;發送消息的應用消費者(…

Flink task、Operator 和 UDF 之間的關系

要真正駕馭 Flink 并構建出高效、穩定、可擴展的流處理應用&#xff0c;僅僅停留在 API 的表面使用是遠遠不夠的。深入理解其內部的運行機制&#xff0c;洞悉數據從代碼到分布式執行的完整生命周期&#xff0c;以及明晰各個核心組件之間錯綜復雜而又協同工作的關系&#xff0c;…

Veeam Backup Replication系統的安裝與使用

Veeam Backup & Replication系統安裝與使用 系統簡介 核心功能 備份與恢復&#xff1a;專注于虛擬化環境&#xff08;如VMware和Hyper-V&#xff09;的備份與恢復&#xff0c;支持物理服務器和云環境。快速恢復&#xff1a;提供即時恢復功能&#xff0c;可在幾分鐘內恢復…

十四、【ESP32全棧開發指南:搭建輕量級HTTP服務器】

一、HTTP協議基礎 HTTP&#xff08;Hyper Text Transfer Protocol&#xff09;作為互聯網基礎協議&#xff0c;采用請求-響應模型工作&#xff1a; 1.1 HTTP請求組成 GET /uri?query1value1 HTTP/1.1 // 請求行&#xff08;方法URI協議版本&#xff09; Host: example…

java中LinkedList和ArrayList的區別和聯系?

我們被要求解釋Java中LinkedList和ArrayList的區別和聯系。下面將分別從實現原理、性能特點、使用場景等方面進行詳細說明&#xff0c;并總結它們的相同點和不同點。 # 一、聯系&#xff08;共同點&#xff09; 1. 都實現了List接口&#xff0c;因此具有List接口的所有方法&…

明遠智睿SD2351核心板:邊緣計算時代的工業級核心引擎深度解析

在工業4.0與物聯網深度融合的背景下&#xff0c;邊緣計算設備正從單一功能模塊向高集成度、智能化平臺演進。明遠智睿推出的SD2351核心板&#xff0c;憑借其異構計算架構、工業級接口資源和全棧技術生態&#xff0c;重新定義了邊緣計算設備的性能邊界。本文將從技術架構、場景適…

Flask 動態模塊注冊

目錄 1. 項目概述2. 項目結構3. 核心組件解析3.1 動態模塊注冊系統 (api/__init__.py)3.2 應用程序入口 (setup_demo.py) 4. 模塊開發指南4.1 標準模塊 (*_app.py)4.2 SDK模塊 (sdk/*.py) 5. URL路徑規則6. 如何使用6.1 啟動應用6.2 添加新模塊 7. 工作原理 1. 項目概述 這個項…

JVM 內存、JMM內存與集群機器節點內存的聯系

目錄 1、JVM 內存 1.1、分配機制 1.2、jvm模型位置 1.3、字節碼內存塊 2、JMM內存 2.1、JMM模型 2.2、工作流程圖 1、工作內存與主內存的交互 2. 多線程下的主內存與堆內存交互 2.3、 主內存與工作內存的同步方案 1、volatile 2、synchronized 3、final 3、內存使…

學習昇騰開發的第一天--環境配置

1、昇騰社區官網&#xff1a;昇騰社區官網-昇騰萬里 讓智能無所不及 2、產品-->選擇開發者套件-->點擊制卡工具的下載&#xff1a;資源-Atlas 200I DK A2-昇騰社區 3、如果制卡工具不能使用在線制卡&#xff0c;可以下載鏡像到本地使用本地制卡&#xff1a;Linux系統制…

Android WebView 深色模式適配方案總結

Android WebView 深色模式適配方案總結 在 Android WebView 中適配深色模式&#xff08;Dark Mode&#xff09;是一個常見的需求&#xff0c;尤其是當加載的網頁沒有原生支持 prefers-color-scheme 時。本文將介紹 3 種主流方案&#xff0c;并分析它們的優缺點&#xff0c;幫助…

項目練習:使用mybatis的foreach標簽,實現union all的拼接語句

文章目錄 一、需求說明二、需求分析三、代碼實現四、報表效果 一、需求說明 在sql查詢數據后&#xff0c;對數據分組統計。并最后進行總計。 二、需求分析 最終&#xff0c;我想用sql來實現這個統計和查詢的功能。 那么&#xff0c;怎么又查詢&#xff0c;又統計了&#xf…

7.7 Extracting and saving responses

Chapter 7-Fine-tuning to follow instructions 7.7 Extracting and saving responses 在本節中&#xff0c;我們保存測試集響應以便在下一節中評分&#xff0c;除此之外保存模型的副本以供將來使用。 ? 首先&#xff0c;讓我們簡單看看finetuned模型生成的響應 torch.manu…

計算機網絡第3章(上):數據鏈路層全解析——組幀、差錯控制與信道效率

目錄 一、數據鏈路層的功能二、組幀2.1 字符計數法&#xff08;Character Count&#xff09;2.2 字符填充法&#xff08;Character Stuffing&#xff09;2.3 零比特填充法2.4 違規編碼法 三、差錯控制3.1 檢錯編碼&#xff08;奇偶校驗碼&#xff09;3.2 循環冗余校驗&#xff…

鑄鐵試驗平臺的重要性及應用前景

鑄鐵作為一種重要的金屬材料&#xff0c;在工業生產中扮演著舉足輕重的角色。為了確保鑄鐵制品的質量和性能&#xff0c;鑄鐵材料的試驗是必不可少的環節。而鑄鐵試驗平臺則是進行鑄鐵試驗的關鍵設備之一&#xff0c;它為鑄鐵材料的研究和開發提供了重要的技術支持。本文將探討…

std::shared_ptr引起內存泄漏的例子

目錄 一、循環引用&#xff08;最常見場景&#xff09; 示例代碼 內存泄漏原因 二、共享指針管理的對象包含自身的 shared_ptr 示例代碼 內存泄漏&#xff08;或雙重釋放&#xff09;原因 三、解決方案 1. 循環引用&#xff1a;使用 std::weak_ptr 2. 對象獲取自身的 …

AI 知識數據庫搭建方案:從需求分析到落地實施

AI 知識數據庫的搭建需結合業務場景、數據特性與技術架構&#xff0c;形成系統化解決方案。以下是一套完整的搭建框架&#xff0c;涵蓋規劃、設計、實施及優化全流程&#xff1a; 一、前期規劃&#xff1a;需求分析與目標定義 1. 明確業務場景與知識需求 場景導向&#xff1a…

Tensorflow 基礎知識:變量、常量、占位符、Session 詳解

在深度學習領域,TensorFlow 是一個廣泛使用的開源機器學習框架。想要熟練使用 TensorFlow 進行模型開發,掌握變量、常量、占位符和 Session 這些基礎知識是必不可少的。接下來,我們就深入了解一下它們的概念、用處,并通過代碼示例進行演示。 一、常量(Constant) 常量,顧…

linux 常見問題之如何清除大文件的內容

linux 常見問題之如何清除大文件的內容 在 Linux 系統中&#xff0c;我們有時會遇到文件隨著時間增長變得巨大&#xff0c;最常見的就是服務器的日志文件&#xff0c;隨著時間的推移占用大量的磁盤空間&#xff0c;下面介紹如何清楚大文件的內容&#xff0c;當然避免文件內容過…

薛定諤的貓思想實驗如何推演到量子計算

前言 這是我的選修課作業&#xff0c;但是我并不喜歡小論文方式的寫法&#xff0c;死板又老套。先在這打一份底稿。 薛定諤的貓 可能一說到量子這個關鍵詞&#xff0c;大家第一時間都會想到的是“薛定諤的貓”。 實驗介紹 薛定諤的貓是一個著名的思想實驗&#xff0c;由奧…