Linux動態鏈結庫的使用

2021-08-01 13:39:37 字數 2509 閱讀 9669

1、前言

在實際開發過程中,各個模組之間會涉及到一些通用的功能,比如讀寫檔案,查詢、排序。為了減少**的冗餘,提高**的質量,可以將這些通用的部分提取出來,做出公共的模組庫。通過動態鏈結庫可以實現多個模組之間共享公共的函式。之前看《程式設計師的自我修養》中講到程式的鏈結和裝入過程,這些玩意都是底層的,對於理解程式的編譯過程有好處。博文介紹了程式的鏈結和裝入過程。本文重點在於應用,如何編寫和使用動態鏈結庫,後續使用動態鏈結庫實現乙個外掛程式。

2、動態鏈結庫生產

動態鏈結庫與普通的程式相比而言,沒有main函式,是一系列函式的實現。通過shared和fpic編譯引數生產so動態鏈結庫檔案。程式在呼叫庫函式時,只需要連線上這個庫即可。例如下面實現乙個簡單的整數四則運輸的動態鏈結庫,定義的caculate.h和caculate.c兩個檔案,生產libcac.so動態鏈結庫。

程式**如下:

/*

caculate.h

*/#ifndef caculate_head_

#define caculate_head_

//加法

int add(int a, int

b);//

減法int sub(int a, int

b);//

除法int div(int a, int

b);//

乘法int mul(int a, int

b);#endif

/*caculate.c檔案*/

#include "

caculate.h"//

求兩個數的和

int add(int a, int

b)//

減法int sub(int a, int

b)//

除法int div(int a, int

b)//

乘法int mul(int a, int

b)

編譯生產libcac.so檔案如下:gcc -shared -fpic caculate.c -o libcac.so

編寫乙個測試程式呼叫此動態鏈結庫的函式,程式如下所示:

#include #include 

"caculate.h

"int

main()

編譯生產可執行檔案main如下:gcc main.c -o main -l ./ -lcac

(其中-l指明動態鏈結庫的路徑,-l後是鏈結庫的名稱,省略lib)

程式執行結果如下所示:

3、獲取動態鏈結庫的函式

linux提供dlopen、dlsym、dlerror和dlcolose函式獲取動態鏈結庫的函式。通過這個四個函式可以實現乙個外掛程式,方便程式的擴充套件和維護。函式格式如下所示:

#include void *dlopen(const

char *filename, int

flag);

char *dlerror(void

);void *dlsym(void *handle, const

char *symbol);

int dlclose(void *handle);

link with -ldl.

dlopen()是乙個強大的庫函式。該函式將開啟乙個新庫,並把它裝入記憶體。該函式主要用來載入庫中的符號,這些符號在編譯的時候是不知道的。寫個測試程式呼叫上面生產libcac.so庫如下所示:

#include #include 

#define dll_file_name "libcac.so"

intmain()

func = dlsym(handle, "

add"

); printf(

"%d + %d = %d\n

", a, b, func(a, b));

func = dlsym(handle, "

sub"

); printf(

"%d + %d = %d\n

", a, b, func(a, b));

func = dlsym(handle, "

div"

); printf(

"%d + %d = %d\n

", a, b, func(a, b));

func = dlsym(handle, "

mul"

); printf(

"%d + %d = %d\n

", a, b, func(a, b));

dlclose(handle);

return0;

}

程式執行結果如下所示:gcc call_main.c -o call_main -ldl

4、參考**

Linux動態鏈結庫的使用

1 前言 在實際開發過程中,各個模組之間會涉及到一些通用的功能,比如讀寫檔案,查詢 排序。為了減少 的冗餘,提高 的質量,可以將這些通用的部分提取出來,做出公共的模組庫。通過動態鏈結庫可以實現多個模組之間共享公共的函式。之前看 程式設計師的自我修養 中講到程式的鏈結和裝入過程,這些玩意都是底層的,對...

Linux動態鏈結庫的使用

linux動態鏈結庫的使用 1 前言 在實際開發過程中,各個模組之間會涉及到一些通用的功能,比如讀寫檔案,查詢 排序。為了減少 的冗餘,提高 的質量,可以將這些通用的部分提取出來,做出公共的模組庫。通過動態鏈結庫可以實現多個模組之間共享公共的函式。之前看 程式設計師的自我修養 中講到程式的鏈結和裝入...

Linux動態鏈結庫的使用

1 前言 在實際開發過程中,各個模組之間會涉及到一些通用的功能,比如讀寫檔案,查詢 排序。為了減少 的冗餘,提高 的質量,可以將這些通用的部分提取出來,做出公共的模組庫。通過動態鏈結庫可以實現多個模組之間共享公共的函式。之前看 程式設計師的自我修養 中講到程式的鏈結和裝入過程,這些玩意都是底層的,對...