Linux 靜態庫 和 動態庫

在Linux系統上,庫文件用于共享和重用代碼。根據使用方式和鏈接方式的不同,庫文件可以分為靜態庫和動態庫。

靜態庫(Static Library)

靜態庫是在編譯時被嵌入到最終可執行文件中的庫。靜態庫的擴展名通常是.a。

特點

  1. 獨立性:靜態庫在編譯時就被包含在可執行文件中,因此可執行文件獨立于庫的存在。
  2. 大小增加:由于靜態庫的代碼被直接復制到可執行文件中,最終的可執行文件大小會增加。
  3. 加載速度快:因為庫代碼已經在可執行文件中,不需要在運行時加載,啟動速度較快。
  4. 更新困難:更新靜態庫中的代碼需要重新編譯可執行文件。

創建靜態庫

1.編寫源代碼:

假設你有兩個源文件’foo.c’ 和 ‘bar.c’
foo.c:

// foo.c
#include <stdio.h>void foo() {printf("This is function foo.\n");
}

bar.c:

// bar.c
#include <stdio.h>void bar() {printf("This is function bar.\n");
}

2.編譯源文件:

使用 gcc 將源文件編譯為目標文件(.o 文件)。

gcc -c foo.c bar.c
這將生成 foo.o 和 bar.o 兩個目標文件。

3.創建靜態庫:

使用 ar 命令將目標文件打包成靜態庫。

ar rcs libmylib.a foo.o bar.o
這將創建一個名為 libmylib.a 的靜態庫文件。

使用靜態庫

1.編寫主程序:

創建一個使用靜態庫的主程序 main.c。

main.c:

// main.c
void foo();
void bar();int main() {foo();bar();return 0;
}

2.編譯并鏈接靜態庫:

在編譯主程序時鏈接靜態庫。

gcc -o myprogram main.c -L. -lmylib
其中,-L. 指定庫的路徑,-lmylib 指定鏈接的庫名(libmylib.a)。

3.運行程序:

執行生成的可執行文件。
./myprogram
輸出將會是:
This is function foo.
This is function bar.

動態庫(Dynamic Library)

動態庫是在運行時被加載的庫。動態庫的擴展名通常是.so(共享對象)。

特點

  1. 共享性:多個程序可以共享同一個動態庫,節省內存和磁盤空間。
  2. 可更新性:更新動態庫時,不需要重新編譯使用該庫的可執行文件,只需替換動態庫即可。
  3. 加載速度慢:在運行時加載動態庫,啟動速度可能比靜態庫稍慢。
  4. 依賴性:可執行文件依賴動態庫的存在和版本匹配,缺失或版本不匹配會導致程序無法運行。

創建動態庫

1.編寫源代碼:

假設你有兩個源文件’foo.c’ 和 ‘bar.c’
foo.c:

// foo.c
#include <stdio.h>void foo() {printf("This is function foo.\n");
}

bar.c:

// bar.c
#include <stdio.h>void bar() {printf("This is function bar.\n");
}

2.編譯源文件:

使用 gcc 將源文件編譯為位置無關代碼(Position Independent Code, PIC)的目標文件(.o 文件)。

gcc -fPIC -c foo.c bar.c
這將生成 foo.o 和 bar.o 兩個目標文件。

3.創建動態庫:

使用 gcc 將目標文件鏈接成動態庫。

gcc -shared -o libmylib.so foo.o bar.o
這將創建一個名為 libmylib.so 的動態庫文件。

使用動態庫

1.編寫主程序:

創建一個使用動態庫的主程序 main.c。

main.c:

// main.c
void foo();
void bar();int main() {foo();bar();return 0;
}

2.編譯并鏈接動態庫:

在編譯主程序時鏈接動態庫。

gcc -o myprogram main.c -L. -lmylib
其中,-L. 指定庫的路徑,-lmylib 指定鏈接的庫名(libmylib.so)。

3.設置庫路徑并運行程序:

在運行時,動態庫需要在系統的庫搜索路徑中,可以通過設置 LD_LIBRARY_PATH 環境變量指定路徑。

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
./myprogram

輸出將會是:
This is function foo.
This is function bar.

解釋 export LD_LIBRARY_PATH=.: $ LD_LIBRARY_PATH:

export:這是一個 shell 命令,用于設置環境變量,使其對后續的命令和腳本可見。
LD_LIBRARY_PATH=.:將當前目錄(. 表示當前目錄)添加到 LD_LIBRARY_PATH 中。這樣,系統會在當前目錄中查找動態庫。
:$LD_LIBRARY_PATH:將已有的 LD_LIBRARY_PATH 環境變量的值追加到新的 LD_LIBRARY_PATH 中。這保證了之前設置的搜索路徑不會丟失。

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

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

相關文章

ADOP帶你了解:SFP 光模塊:構建高速網絡的關鍵技術

在數字化時代&#xff0c;企業運營的效率往往取決于數據傳輸的速度。因此&#xff0c;構建一個可靠的網絡基礎架構至關重要。本指南深入探討了小型可插拔&#xff08;SFP&#xff09;光收發器的關鍵作用&#xff0c;這些設備確保了網絡中數據的高效和安全流動。SFP光收發器的設…

【Rust入門教程】hello world程序

文章目錄 前言Hello World程序運行總結 前言 對于學習任何一種新的編程語言&#xff0c;我們都會從編寫一個簡單的Hello World程序開始。這是一個傳統&#xff0c;也是一個開始。在這篇文章中&#xff0c;我們將一起學習如何在Rust中編寫你的第一個程序&#xff1a;Hello Worl…

【C語言內存函數】

目錄 1.memcpy 使用 模擬實現 2.memmove 使用 模擬實現 3.memset 使用 4.memcmp 使用 1.memcpy 使用 void * memcpy ( void * destination, const void * source, size_t num );目的地址 源地址 字節數 destination&#xff1a;指向要復制內…

20240703 每日AI必讀資訊

&#x1f916;爆火Character AI慘遭閹割 美國00后集體“失戀” - Character AI曾是00后最火爆的社交軟件&#xff0c;但用戶發現對話模型變得冷淡&#xff0c;失去趣味。 - 用戶流失嚴重&#xff0c;面臨成本高、競爭激烈的挑戰&#xff0c;甚至遭到挖角。 - 盡管困難重重&a…

淘寶API接口開發系列:淘寶訂單詳情API接口與物流電子面單API接口概述

淘寶訂單詳情API接口與物流電子面單API接口概述 在電子商務領域&#xff0c;API&#xff08;應用程序接口&#xff09;扮演著至關重要的角色&#xff0c;它們使得不同的系統能夠相互通信&#xff0c;實現數據的共享和交換。淘寶作為國內最大的電商平臺之一&#xff0c;其提供的…

C# 多線程造成CPU占用率高

當線程多的時候就會造成CPU內存占用率過高 private void button1_Click(object sender, EventArgs e){Thread TH1, TH2, TH3, TH4, TH5;TH1 new Thread(Thread1){IsBackground true};TH2 new Thread(Thread2){IsBackground true};TH3 new Thread(Thread3){IsBackground t…

最小步數模型——AcWing 1107. 魔板

最小步數模型 定義 最小步數模型通常是指在某種約束條件下&#xff0c;尋找從初始狀態到目標狀態所需的最少操作或移動次數的問題。這類問題廣泛存在于算法、圖論、動態規劃、組合優化等領域。具體來說&#xff0c;它涉及確定一個序列或路徑&#xff0c;使得按照特定規則執行…

jenkins在使用pipeline時,為何沒有方塊形視圖

項目場景&#xff1a; 安裝完Jenkins時后&#xff0c;通過pipeline創建的項目任務。 問題描述 在立即構建后&#xff0c;沒有顯示每個階段的視圖。 原因分析&#xff1a; 原因是&#xff0c;剛安裝的Jenkins&#xff0c;這個視圖不是Jenkins自帶的功能&#xff0c;而必須安裝…

《5小時吃透小red書》讀書筆記之打造爆款筆記原理

1.流量推送邏輯&#xff1a; 一篇筆記發布并審核后&#xff0c;平臺根據內容提取關鍵詞&#xff0c;開始小范圍發布測試&#xff1b;初次先分發到1000個興趣用戶&#xff0c;根據這1000個用戶等反饋決定是否給該筆記更多流量和推薦&#xff1b;考核標準是點擊率、完播率、互動…

高校實訓室:老年實訓室的教學案例

本文以高校老年實訓室為研究對象&#xff0c;通過詳細分析具體的教學案例&#xff0c;探討了老年實訓室在提升學生專業素養和實踐能力方面的重要作用。文中介紹了多個具有代表性的教學案例&#xff0c;包括健康評估、康復護理和心理關懷等方面&#xff0c;闡述了其教學目標、實…

EDA 虛擬機 Synopsys Sentaurus TCAD 2017.09 下載

下載地址&#xff08;制作不易&#xff0c;下載使用需付費&#xff0c;不能接受的請勿下載&#xff09;&#xff1a; 鏈接&#xff1a;https://pan.baidu.com/s/1327I58gvV1usWSqSrG7KXw?pwdo03i 提取碼&#xff1a;o03i

Boss直聘,無良廠商,亂封號

耽誤招工作&#xff0c;瞎吉兒封號 哥們單身 需要女生多的公司 問一下都不行&#xff0c;什么尿性 直接就給你封了 裝什么呢 辣雞boss 倒閉吧趕緊 我是狗子&#xff0c;希望你倒閉&#xff01;

枚舉類示例

package net.cnki.editor.costcenter.pojo.enums;import lombok.Getter;import java.util.Arrays;/*** 費用枚舉接口*/ public interface CosttypeEnumInterface {/*** 費用類型和費用信息-> 費用性質, 支付人 , 收取人, 費用信息狀態*/Getterenum CosttypePayerAndReceiveE…

使用PHP實現Web爬蟲

web爬蟲是一種自動化工具&#xff0c;可以瀏覽互聯網上的網頁&#xff0c;收集信息并存儲在一個數據庫中。在今天的大數據時代&#xff0c;web爬蟲越來越重要&#xff0c;因為它可以查找大量信息并進行數據分析。在本文中&#xff0c;我們將學習如何使用php編寫web爬蟲&#xf…

Radxa 學習摘錄

文章目錄 1、參考資料2、硬件知識CIF 和 ISP 3、shell4、交叉編譯工具鏈5、問題6、DTS7、驅動 1、參考資料 技術論壇&#xff08;推薦&#xff09; 官方資料下載 wiki資料 u-boot 文檔 u-boot 源碼 內核文檔 內核源碼 原理圖 radxa-repo radxa-build radxa-pkg radxa-doc…

尋找最適合你的交易風格

與Eagle Trader一起&#xff0c;您將擁有一位堅不可摧的合作伙伴&#xff0c;為您的交易之路增添堅實信心&#xff0c;并重塑交易體驗的每一個細節。我們量身定制的交易環境&#xff0c;更能讓您精準捕捉并駕馭符合您獨特交易風格的卓越條件&#xff0c;讓交易之旅更加自由暢快…

Python容器 之 字典--定義

1.字典的介紹 1, 字典 dict, 使用 {} 表示 2, 字典是由鍵(key)值(value)對組成的, key: value 3, 一個鍵值對是一組數據, 多個鍵值對之間使用 逗號隔開 4, 在一個字典中, 字典的鍵 是不能重復的&#xff0c;如果重復原數據會被覆蓋 5, 字典中的鍵 主要使用 字符串類型, 可以是…

Mac可以卸載掉系統自帶的軟件嗎 Mac第三方軟件無法卸載是為什么

在使用Mac電腦時&#xff0c;有時候我們會發現系統預裝的一些應用并不常用或者不符合個人需求&#xff0c;想要將它們卸載掉。然而&#xff0c;對于系統自帶的軟件&#xff0c;卸載并不簡單&#xff0c;需要謹慎對待以免影響系統穩定性和功能正常運行。下面我們來看看Mac可以卸…

Firefox 編譯指南2024 Windows10-使用Git 管理您的Firefox(五)

1. 引言 在現代軟件開發中&#xff0c;版本控制系統&#xff08;VCS&#xff09;是不可或缺的工具&#xff0c;它不僅幫助開發者有效管理代碼的變化&#xff0c;還支持團隊協作與項目管理。Mercurial 是一個高效且易用的分布式版本控制系統&#xff0c;其設計目標是簡潔、快速…

Linux CentOS Python 離線安裝 pip 使用.whl文件離線安裝

1、系統版本 cat /etc/redhat-release #查看系統版本命令 輸出&#xff1a;CentOS Linux release 7.9.2009 (Core) 2、在pip 官方網站 下載.whl文件&#xff1a;pip-24.1.1-py3-none-any.whl 3、安裝 python -m pip install pip-24.1.1-py3-none-any.whl 3、安裝之后運行…