dlopen動態函式庫的載入。

2021-07-07 01:38:03 字數 2633 閱讀 9880

前言

如論在linux上程式設計還是在windows上程式設計,為了程式的可擴充套件性,很多地方都用到了動態庫的載入。這裡來談談linux下的程式的動態函式庫的建立和載入。

建立動態庫

在linux下邊編譯成so庫,gcc -fpic -shared ***.c -o lib***.so

int add(int a,int b)

gcc -fpic -shared caculate.c -o libcaculate.so

3.動態庫呼叫函式介紹

void *dlopen(const

char *filename,int flag);

filename:要載入動態庫的絕對路徑或者相對路徑,相對以程式所執行的目錄為準。

flag: rtld_lazy 暫緩決定,等到需要時,調dlsym解析符號

rtld_now :立即決定,返回所有的未決函式,呼叫dlsym返回所有的。

以下符號可以與上面的符號一起使用。

rtld_local:

rtld_global:允許匯出符號,後面可以使用。

rtld_group:

rt_world:

void *dlsym(void *handle,const

char *symbol)

根據symbol,返回與符號對應的函式位址。

symbol可以是函式或者全域性變數。

在編譯的時候需要加 -ldl

#include 

#include

#include

//載入的動態庫路徑

#define lib_path "./libcaculate.so"

//函式指標

typedef

int (*cac_func)(int, int);

int main()

//清除之前存在的錯誤

dlerror();

//獲取乙個函式

*(void **) (&cac_func) = dlsym(handle, "add");

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

printf("add: %d\n", (*cac_func)(2,7));

cac_func = (cac_func)dlsym(handle, "add");

printf("sub: %d\n", cac_func(9,2));

//關閉動態鏈結庫

dlclose(handle);

exit(exit_success);

}

gcc -rdynamic -o main main.c -ldl

4.常見用法

hello.c

typedef struct

hello_api;

int getvalue(char *pstval)

int printhello()

const hello_api hello = ;

再編譯成lib。

這樣調dlsym時,只用呼叫一次,就可以獲取所有的函式。

caculate.c

#include 

typedef struct caculate_api

caculate_api;

int add(int a,int b)

intsub(int a, int b)

int mul(int a, int b)

int div(int a, int b)

const caculate_api caculate = ;

main.c

#include 

#include

#include

typedef struct caculate_api

caculate_api;

//動態鏈結庫路徑

#define lib_caculate_path "./libcaculate.so"

int main()

//清除之前存在的錯誤

dlerror();

//獲取乙個函式

caculate = dlsym(handle, "caculate");

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

printf("get caculate_api successfully\n");

if (caculate && caculate->module )

if (caculate && caculate->add )

if (caculate && caculate->sub)

if (caculate && caculate->mul)

if (caculate && caculate->div)

//關閉動態鏈結庫

dlclose(handle);

exit(exit_success);

}

靜態函式庫與動態函式庫的設計

函式庫存放位置 linux應用程式使用的主要函式均放在 lib和 usr lib目錄下,其中採用 so.命名的是動態函式庫,而以 a方式命名的是靜態函式庫。靜態函式庫的特點 程式所要用到的庫函式 在鏈結時全部被copy到程式中。導致的問題 如果有多個程序在記憶體中同時執行,並且使用了相同的函式庫,那...

Linux 下的靜態(函式)庫 動態(函式)庫

不用指定生成.o檔名 預設生成file1.o,file2.o,file3.o ar rv libname.a file1.o file2.o file3.or 將flie1.o,file2,o,file3.o插入archive,如故原先archive中已經存在某檔案,則先將該檔案刪除。v 顯示ar操...

Linux的靜態函式庫和動態函式庫

一 在linux中,有兩種函式庫,以 so字尾命名的是動態函式庫,以 a字尾命名的是靜態函式庫 二 靜態函式庫 1 靜態函式庫是多個目標檔案 o的集合 2 可以使用ar命令 archiver 來生成.a檔案 gcc c part a.c gcc c part b.c ar r libtest.a p...