前言
如論在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...