一、介紹
在軟體程式設計中,通常會把功能或介面函式封裝成庫的形式,供給其它模組或第三方使用。在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...