linux共享庫動態載入

2021-05-23 15:11:49 字數 1426 閱讀 1463

首先設想一種情況,我們需要將某個功能做成可配置的,比如近期再弄的圖形系統,風格應該是可配置的:在配置檔案中用字串記錄使用到的「畫法」庫(這個「畫法」就比如windows裡面的開始按鈕,「windows經典」風格是乙個矩形,而「windows xp「風格則是乙個圓角矩形,它們使用的繪圖方法當然不一樣),改動配置檔案中「畫法」庫的路徑、名字,就可以實現風格的可配置~~而且,根據既定的介面,還可以自由新增新的風格,不需要重新編譯,只要把新寫好的函式編譯成庫,改動配置檔案中需要使用的庫的路徑和名字就ok了。

下面記下來這次實驗用到的東西~

需要用到的函式:

#include

void * dlopen(const char *

file

, int

mode);

void * dlsym(void *restrict

handle

, const char *restrict

name);

char * dlerror(void);

int dlclose(void *);

其中,

dlopen開啟file路徑下的共享庫檔案,返回這個共享庫的操作指標handle。mode可取值有2個:rtld_lazy和rtld_now, rtld_lazy就是第一次用到庫中的函式時才進行重定位,rtld_now就是馬上咯~

dlsym將dlopen返回的handle中的name函式載入,將返回值賦值給我們宣告的函式指標就是了~

dlerror返回這些過程中的錯誤資訊,字串~

dlclose,關閉已開啟的共享庫~

下面是個框架例子:

#include

#include

int main()

int (* my_function)(int);/* 宣告乙個函式指標,用來指向要載入的共享庫中的函式 */

char * error;/* 用來記錄錯誤資訊 */

void * handle;/* 這個指標指向開啟的庫 */

char * libfile;/* 要開啟的庫的路徑、檔名 */

init others

handle = dlopen(file, rtld_lazy);/* 開啟庫 */

if (!handle)

my_function = dlsym(handle, "function");/* 將庫中的function函式載入到my_function指標 */

if ((error = dlerror()) != null)

*my_function(2);/* 呼叫庫中的函式 */

dlclose(handle);/* 正常關閉庫 */

return 0;

這個框架中,假定開啟的庫中有乙個定義為【  int function(int)  】 的函式,我們宣告了乙個與之對應的函式指標,實現動態載入和呼叫。

靜態庫,共享庫,動態載入庫

一 靜態庫 1.概念 靜態庫就是一些目標檔案的集合,以.a結尾。靜態庫在程式鏈結的時候使用,鏈結器會將程式中使用 到函式的 從庫檔案中拷貝到應用程式中。一旦鏈結完成,在執行程式的時候就不需要靜態庫了。由於每個使用靜態庫的應用程式都需要拷貝所用函式的 所以靜態鏈結的檔案會比較大。2.建立與應用 首先建...

Linux下動態共享庫 連線和載入路徑

1.連線時找不到某乙個函式,出現 xx undefined 應該就是連線時找不到相應的動態庫,連線時動態庫的路徑如下 1 預設路徑是 lib,usr lib usr local lib 2 l 指定連線時動態庫的路徑 3 ld library path 指定連線路徑 2.執行應用程式時出現 erro...

Linux下動態共享庫 連線和載入路徑

1.連線時找不到某乙個函式,出現 xx undefined 應該就是連線時找不到相應的動態庫,連線時動態庫的路徑如下 1 預設路徑是 lib,usr lib usr local lib 2 l 指定連線時動態庫的路徑 3 ld library path 指定連線路徑 2.執行應用程式時出現 erro...