動態庫和靜態庫的鏈接加載

靜態庫的鏈接與加載

靜態庫(如.a.lib文件)在編譯時直接鏈接到可執行文件中。編譯器會將靜態庫中實際用到的代碼復制到最終的可執行文件,生成獨立的二進制文件。優點是不依賴外部庫文件,但會導致可執行文件體積較大。

生成靜態庫的示例命令(Linux):

ar rcs libexample.a file1.o file2.o

鏈接靜態庫的編譯命令:

gcc main.c -L. -lexample -o program

動態庫的鏈接與加載

動態庫(如.so.dll文件)在運行時加載,可被多個程序共享。分為兩種加載方式:

隱式加載(編譯時鏈接)
編譯器記錄庫的依賴信息,程序啟動時由動態鏈接器自動加載。需要同時提供頭文件和庫文件路徑。

編譯命令示例:

gcc -shared -fPIC -o libexample.so file1.c file2.c
gcc main.c -L. -lexample -o program

顯式加載(運行時手動加載)
通過dlopen()等API在代碼中動態加載,適合插件化設計。需自行處理符號查找和錯誤。

示例代碼片段:

void* handle = dlopen("./libexample.so", RTLD_LAZY);
if (handle) {void (*func)() = dlsym(handle, "function_name");if (func) func();dlclose(handle);
}

關鍵差異對比

  • 文件大小:靜態庫會增大可執行文件,動態庫共享代碼
  • 內存占用:動態庫可節省內存(多個進程共享)
  • 更新維護:動態庫無需重新編譯主程序即可更新
  • 依賴管理:動態庫需要確保運行時環境存在對應庫文件
  • 加載時機:靜態庫在編譯時確定,動態庫可延遲加載

常見問題處理

  • 動態庫路徑問題:通過LD_LIBRARY_PATH環境變量或rpath指定搜索路徑
  • 符號沖突:靜態庫可能導致重復符號定義,動態庫通過版本控制解決
  • 性能考量:靜態庫調用無額外開銷,動態庫存在加載和跳轉成本

Windows平臺注意:

  • 動態庫對應.dll.lib(導入庫)
  • 顯式加載使用LoadLibrary()GetProcAddress()API

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

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

相關文章

如何處理在pytorch環境中已經安裝的matplotlib無法使用的問題

1 問題已經安裝好的matplotlib包無法在pytorch環境中使用。2 方法方法一:用命令安裝matplotlib :方法二:打開cmd,使用conda install matplotlib命令安裝matplotlib庫#輸入以下代碼段,查詢當前執行路徑import osos.sys.…

Linux基礎命令匯總

系統基礎指令 ls:列出目錄內容 ls -a:顯示所有文件(包括隱藏文件) ls -l:顯示詳細文件信息 ls /etc:列出 /etc 目錄內容 示例: cat:查看文件內容 cat /etc/os-release:查看系統版本信息 cat file1:顯示文件內容 cat file1 file2 > merged.txt:合并文件并輸出到新…

一場史詩級的冒險——Docker命令大航海!

各位親愛的開發者、運維勇士、以及所有對現代化軟件部署充滿好奇的小伙伴們!今天,我們將開啟一場史詩級的冒險——Docker命令大航海!我們將乘坐“Docker號”巨輪,駛向容器化技術的星辰大海。 這不是一篇枯燥的說明書,而…

告別依賴混亂:Spring IoC 容器與 DI 依賴注入入門精講

目錄 什么是 IoC IoC 介紹 傳統開發思路 解決方法 IoC 優勢 DI IoC & DI 使用 IoC 詳解 Bean 的存儲 Controller(控制器存儲) 獲取 bean 對象的其他方法 bean 命名 面試題之 ApplicationContext pk BeanFactory Service(服…

視頻理解學習筆記

目錄 VideoRefer VideoPrism 核心解密:通用視頻編碼器的力量 VideoRefer VideoRefer 是由浙江大學和阿里達摩院聯合推出的視頻對象感知與推理技術,增強視頻大型語言模型(Video LLMs)的空間-時間理解能力。簡單一點來說就是可以…

P1198題解

題目鏈接 開題第一件事看數據范圍.這里的范圍是二十萬,支持O(nlogn). 這是一個RMQ問題,同時要加點,我們因此考慮ST表或者線段樹.這里用線段樹是核彈打蚊子,沒有意義,我們因此考慮ST表.我們注意到如果加點操作需要改動ST表原來的東西ST表就會炸掉,我們就要考慮更高級的數據結構…

使用yolov8對視頻進行目標檢測

使用 Ultralytics 的 YOLO 模型對視頻進行逐幀目標檢測非常簡單,以下是完整的實現方法: 我們的輸入視頻是這樣的 視頻目標檢測輸入視頻這里是天津市和平區天津大學附近,感興趣的小伙伴來天津玩哈!! 1. 安裝依賴 確保已…

Edge瀏覽器的自動化點擊系統

Tag_click_openclose_V6 開發與使用注意事項 網頁自動化點擊系統 一個基于Python和CustomTkinter開發的桌面應用程序,通過Selenium實現對Edge瀏覽器的自動化控制。點擊Tag_click_openclose_V6進入Github自取,記得點贊收藏嗷。 功能介紹 連接到已打開…

Python股票數據分析與預測系統 LSTM神經網絡算法 股票價格預測 Tensorflow深度學習 機器學習 Flask框架 東方財富(建議收藏)?

博主介紹:?全網粉絲50W,前互聯網大廠軟件研發、集結碩博英豪成立軟件開發工作室,專注于計算機相關專業項目實戰6年之久,累計開發項目作品上萬套。憑借豐富的經驗與專業實力,已幫助成千上萬的學生順利畢業,…

英萊科技焊縫跟蹤系統亮相德國埃森焊接展,激光視覺點亮世界舞臺

9月15-19日,每4年一屆的德國埃森焊接與切割展覽會(SCHWEISSEN & SCHNEIDEN)即將盛大開幕。作為焊接行業最具規模及權威性的盛會之一,英萊科技將攜全新PF系列激光視覺焊縫跟蹤系統驚艷亮相,為全球智能化焊接貢獻中國…

嵌入式基本概念:什么是指令集,微架構,IDE,DFP等等是什么意思,有什么關系???

注:下面是指令集和微框架的分類圖,后面我會以ARM的M4舉例子。 一.什么是指令集 大概的可以看這個視頻 https://www.bilibili.com/video/BV1uXzbYBEy2/?spm_id_from333.1007.top_right_bar_window_custom_collection.content.click&vd_source406ed…

Spring Cloud之服務入口Gateway之自定義過濾器

目錄 過濾器執行順序 自定義過濾器 自定義GatewayFilter 定義GatewayFilter 配置過濾器 啟動服務并訪問 自定義GlobalFilter 定義GlobalFilter 啟動服務并訪問 服務部署 過濾器執行順序 如果?個項?中, 既有GatewayFilter, ?有 GlobalFilter時, 執?的先后順序是什…

MySQL——視圖、儲儲過程、觸發器

目錄 一、視圖 二、存儲過程 三、觸發器 一、視圖 視圖是一種虛擬存在的表。視圖中的數據并不在數據庫中真實存在,行和列數據來自定義視圖的查詢中使用的表,并且是在使用視圖時動態生成的。通俗的講,視圖只保存了查詢的SQL邏輯&#xff0c…

iOS App 卡頓與性能瓶頸排查實戰 如何定位CPU內存GPU幀率問題、優化耗電與網絡延遲(uni-app開發性能優化全流程指南)

在 iOS 應用開發中,卡頓 是用戶最直觀的負面體驗。 一個 App 如果在頁面切換、滾動、后臺運行時頻繁掉幀或發熱,用戶很快就會放棄使用。 對于 uni-app 跨平臺開發者 來說,卡頓問題更為復雜: JS 與原生層橋接增加了 CPU 負載&#…

騰訊開源多模態 RAG:復雜文檔秒變自建知識庫,支持 API 調用

上篇,分享了 小智AI MCP系列的第一篇: 小智 AI 鬧鐘提醒 定時任務,設備端MCP實現 有朋友問,能否接入知識庫 RAG? 讓小智可以根據企業知識庫,回答客戶的疑問~ 當然可以,接入方式同樣是 MC…

Node.js中的 http 模塊詳解

http 模塊是 Node.js 中的核心模塊之一,專門用于構建基于 HTTP 的網絡應用程序。它允許創建 HTTP 服務器和客戶端,處理網絡請求和響應。1. 核心 API 詳解1.1. http.createServer([options][, requestListener])用于創建 HTTP 服務器的核心方法&#xff0…

LAMP 環境部署

LAMP 環境部署 一、概述 1. 目的 基于 CentOS 7 系統部署 LAMP(Linux Apache MySQL PHP)環境的完整步驟,通過腳本化操作實現環境快速搭建,適用于運維人員進行測試環境或基礎生產環境的 LAMP 部署 2. 適用環境操作系統&#xff…

用html5仿造nes游戲敲玻璃寫一個敲玻璃游戲

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>敲玻璃游戲</title><style>body {ma…

996引擎-ItemTips特效框層級自定義

996引擎-ItemTips特效框層級自定義 需求場景 ItemTips 中相關方法 創建特效的位置 創建特效框 核心修改 調整視圖,自己加個背景,不用原來的 設置 tipsLayout_bg 的層級 結果預覽 參考資料 需求場景 策劃說我們的tips特效框,遮擋文字。如果按官方說的設為底層又跑到背景框后…

Java 注解與 APT(Annotation Processing Tool)

Java 注解與 APT&#xff08;Annotation Processing Tool&#xff09; 注解&#xff08;Annotation&#xff09;基礎 注解是 Java 語言的一種元數據形式&#xff0c;它可以在代碼中添加標記信息&#xff0c;用于描述代碼的額外信息&#xff0c;但不會直接影響代碼的執行邏輯。注…