Linux下動態庫 so 和靜態庫 a

2021-09-24 11:17:43 字數 2615 閱讀 6154

一般情況下,在專案裡會把功能相似的**封裝成庫,方便使用和管理,同時增加了**的內聚性。

庫分為兩種,一種為靜態庫,檔名以.a結尾,另一種是動態庫,檔名以.so結尾。靜態庫和動態庫的使用各有利弊。

靜態庫的特點:

動態庫的特點:

現在用乙個微型的工程,來講述靜態庫、動態庫的生成和使用。假設有3個.c檔案,分別為:add.c sub.c main.c,實現了add()和sub()這兩個函式,功能是返回兩個整數相加或者相減的結果,main.c中使用到了這兩個函式。下面講述怎樣把這add.c和sub.c兩個檔案生成並使用靜態庫和動態庫,然後生成可執行檔案。

int add(int a, int b);

int add(int a, int b)

int sub(int a, int b);

int sub(int a, int b)

#include "add.h"

#include "sub.h"

#include int main()

1. 生成靜態庫

生成靜態庫一般使用ar命令,語法為:

ar  archivefile.a objfile.o

# archivefile.a 靜態庫的名稱

# objfile.o是目標檔名,可以多個並列

引數

引數意義

-r將objfile檔案插入靜態庫尾或者替換靜態庫中同名檔案

-x從靜態庫檔案中抽取檔案objfile

-t列印靜態庫的成員檔案列表

-d從靜態庫中刪除檔案objfile

-s重置靜態庫檔案索引

-v建立檔案冗餘資訊

-c建立靜態庫檔案

通常步驟是把生成靜態庫所涉及到的.c檔案全都編譯,生成.o檔案,然後使用ar命令生成.a檔案,即靜態庫。這裡需要使用到gcc的-c選項,意思是只進行編譯,不進行鏈結。

gcc -w -c add.c -o add.o

gcc -w -c sub.c -o sub.o

ar cvr libaddsub.a add.o sub.o

此時得到了靜態庫libaddsub.a。可以用命令nm來檢視.a中的符號名稱。

2. 使用靜態庫

使用靜態庫的方法非常簡單,直接把靜態庫的名字加入到需要編譯的檔案裡就可以。如下所示,注意被依賴的靜態庫應該放在後面

gcc -w -c main.c -o main.o

gcc main.o libaddsub.a -o test

執行test得到如下結果:

result of 1 + 1 is: 2

result of 6 - 3 is: 3

3. 生成動態庫

生成動態庫要求編譯出的.o檔案是位置無關的**,也就是說需要使用-fpic選項。然後使用gcc的-shared選項生成動態庫。

gcc -w -c add.c -fpic -o add.o

gcc -w -c sub.c -fpic -o sub.o

gcc -shared add.o sub.o -o libaddsub.so

4. 使用動態庫

生成可執行檔案的時候需要指定動態庫所在的位置,以及動態庫的名稱。-l選項表示指定動態庫所在的目錄,-l選項表示需要鏈結的動態庫的名稱。一般linux下動態庫的明明規則都是lib***.so,其中***為動態庫的真正名稱,所以-l選項的寫法是-l***。-l選項與它後的內容以及-l選項與它後面的內容之間可以沒有空格,也可以加上空格。也就是說,-l***和-l ***都是可以的。

gcc -w -c main.c -o main.o

gcc main.o -o test -l./ -laddsub

如果此時直接執行test的話,會得到類似下面的錯誤:

./test: error while loading shared libraries: libaddsub.so: cannot open shared object file: no such file or directory
意思是libaddsub.so不在系統預設載入動態庫的目錄裡面。解決的辦法有很多種:

ld_library_path=$ld_library_path:pwd ./test
這只是乙個臨時的做法,不建議使用這個方法。

gcc main.o -o test -l./ -laddsub -wl,-rpath=./

./test

執行程式後,還是可以得到和使用靜態庫相同的結果。

參考:

linux下檢視動態庫和靜態庫

靜態庫用ar t yourfile 動態庫用 nm d yourfile 下面是ar和nm命令的一些引數說明 1.ar基本用法 ar命令可以用來建立 修改庫,也可以從庫中提出單個模組。庫是一單獨的檔案,裡面包含了按照特定的結構組織起來的其它的一些檔案 稱做此庫檔案的member 原始檔案的內容 模式...

Linux下的動態庫和靜態庫

靜態庫 程式編譯時載入,可執行程式體積大。一般命名為lib x.a。動態庫 程式執行時載入,可執行程式體積小。一般命名為lib x.so.1.3。x一般指庫名,如libxml2 tinyxml等 動態庫一般預設安裝在 lib 或者 usr lib 或者 usr local lib下。如果安裝的庫不在...

linux下的動態庫和靜態庫

1 使用gcc建立和使用靜態庫 1 gcc o mylib.o c mylib.c 生成o檔案 2 ar rcs libmylib.a mylib.o 生成a檔案 c create的意思 r replace的意思,表示當插入的模組名已經在庫中存在,則替換同名的模組。3 cp libmylib.a u...