Linux 動態庫 靜態庫的生成 使用和優缺點分析

2021-08-22 13:34:36 字數 2579 閱讀 7754

一、介紹

在軟體程式設計中,通常會把功能或介面函式封裝成庫的形式,供給其它模組或第三方使用。在linux系統中存在動態庫和靜態庫兩種形式。

靜態庫:以lib***.a形式命名,編譯程式時,會將靜態庫資料編譯進可執行程式中。

動態庫:以lib***.so形式命名,編譯程式時,不會被編譯進可執行程式中,而在程式執行時,動態的載入該動態庫

二、生成(以libmath_method.a/so為例)

2.1 靜態庫的生成

gcc -c math_method.c

ar cr libmath_method.a math_method.o

ranlib libmath_method.a

檢視庫中包含的檔案:

ar -t libmath_method.a

math_method.o

2.2 動態庫的生成

gcc -fpic -c math_method.c

gcc -shared -o libmath_method.so math_method.o

三、編譯鏈結

-l  指定搜尋庫的目錄

如指定當前目錄 gcc -l .

-l  指定要鏈結的庫的名稱

加入庫的名稱是libmath_method.a(.so),則gcc -lmath_method

鏈結時,如果動態庫和靜態庫同時存在,優先使用動態庫。也可以通過以下的引數指定動態或靜態庫

-wl,-dn :指定動態庫

-wl,-dy:指定動態庫

四、檢視程式鏈結的動態庫庫

$ ldd a.out

linux-vdso.so.1 =>  (0x00007ffff47cb000)

libmath_method.so => not found

libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd659906000)

/lib64/ld-linux-x86-64.so.2 (0x00007fd659cdb000)

五、程式執行

4.1 靜態庫程式的執行

./a.out

4.2 動態庫版本程式的執行

./a.out: error while loading shared libraries: libmath_method.so: cannot open shared object file: no such file or directory

出現上述錯誤是因為找不到動態庫,有以下兩種方式可以解決:

一、可以把當前路徑加入 /etc/ld.so.conf中然後執行ldconfig

二、把當前路徑加入環境變數ld_library_path中,僅在當前環境有效

export ld_library_path=.:$ld_library_path

六、靜態庫和動態庫優缺點

1. 靜態庫程式會將函式庫編譯時程式,因此程式較大, 而動態庫程式較小

2. 由於靜態庫在編譯時已經將函式庫編譯程序式中,因此執行時不需要庫的支援;而動態庫程式在執行時必須提供相應的庫程式

3. 庫檔案變化時,靜態庫程式需要重新編譯; 而動態庫只需要替換執行環境中的庫檔案

4. 多個程式使用庫檔案時,靜態庫需要每個程式都編譯時各自的程式中,而動態庫只需要在執行環境共享乙份即可

七、原始碼

makefile:

cc=gcc

library=-l. -wl,-dy -lmath_method -wl,-dy -lgcc_s

target=a.out

$(target): libmath_method.a libmath_method.so

gcc -o $@ main.c $(library)

math_method.o: math_method.c

$(cc) -fpic -c math_method.c

libmath_method.a: math_method.o

ar cr $@ $^

ranlib $@

libmath_method.so: math_method.o

$(cc) -shared -o $@ $^

.phony:

clean:

-rm -rf *.o *.a

-rm $(target)

main.c:

#include #include "math_method.h"

int main(int arc, char *argv)

math_method.c:

#include int math_add(int a, int b)

int math_sub(int a, int b)

math_method.h:

#ifndef __math_method_h__

#define __math_method_h__

int math_add(int a, int b);

int math_sub(int a, int b);

#endif

Linux動態庫靜態庫的生成

函式庫 1 便於移植,方便使用 2 保密,保護智財權 靜態庫 編譯生成靜態庫 編譯生成靜態庫 1 把.c檔案編譯生成.o檔案 gcc c add.c 或gcc add.c c o add.c 2 把.o檔案編譯生成.a靜態庫 ar rc libadd.a add.o 3 靜態庫的使用 gcc mai...

Linux系統中靜態庫和動態庫的生成和使用

linuxeden超級qq群號 52348914 歡迎加入 一 靜態庫的建立和使用 1 生成靜態庫 庫名 libmylib.a ar rcs libmylib.a mylib.o 2 將靜態庫copy到 usr lib 或 lib 目錄下 cp libmylib.a usr lib 3 靜態庫的使用...

Linux系統中靜態庫和動態庫的生成和使用

一 靜態庫的建立和使用 1 生成靜態庫 庫名 libmylib.a ar rcs libmylib.a mylib.o 2 將靜態庫copy到 usr lib 或 lib 目錄下 cp libmylib.a usr lib 3 靜態庫的使用 比如測試檔案為test.c gcc 0 test test...