為了使程式方便擴充套件,具備通用性,可以採用外掛程式形式。採用非同步事件驅動模型,保證主程式邏輯不變,將各個業務已動態鏈結庫的形式載入進來,這就是所謂的外掛程式。linux提供了載入和處理動態鏈結庫的系統呼叫,非常方便。本文先從使用上進行總結,涉及到基本的操作方法,關於動態鏈結庫的本質及如何載入進來,需要進一步學習,後續繼續補充。如何將程式設計為外掛程式形式,挖掘出主題和業務之間的關係,需要進一步去學習。
int
add(
int a,
int b)
intsub
(int a,
int b)
intmul
(int a,
int b)
intdiv
(int a,
int b)
編譯如下: gcc -fpic -shared caculate.c -o libcaculate.so
**如下:
#include
void
*dlopen
(const
char
*filename,
int flag)
;char
*dlerror
(void);
void
*dlsym
(void
*handle,
const
char
*symbol)
;int
dlclose
(void
*handle)
;
dlopen以指定模式開啟指定的動態連線庫檔案,並返回乙個控制代碼給呼叫程序,dlerror返回出現的錯誤,dlsym通過控制代碼和連線符名稱獲取函式名或者變數名,dlclose來解除安裝開啟的庫。 dlopen開啟模式如下:
rtld_lazy 暫緩決定,等有需要時再解出符號
rtld_now 立即決定,返回前解除所有未決定的符號。
採用上面生成的libcaculate.so,寫個測試程式如下:
#include
#include
#include
//動態鏈結庫路徑
#define lib_caculate_path "./libcaculate.so"
//函式指標
typedef
int(
*cac_func)
(int
,int);
intmain()
//清除之前存在的錯誤
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,
"sub");
printf
("sub: %d\n"
,cac_func(9
,2))
; cac_func =
(cac_func)
dlsym
(handle,
"mul");
printf
("mul: %d\n"
,cac_func(3
,2))
; cac_func =
(cac_func)
dlsym
(handle,
"div");
printf
("div: %d\n"
,cac_func(8
,2))
;//關閉動態鏈結庫
dlclose
(handle)
;exit
(exit_success)
;}
編譯選項如下:gcc -rdynamic -o main main.c -ldl
測試結果如下所示:
這種動態庫的鏈結方式可以很方便的使用,例如在裝置需要替換乙個演算法庫的時候,只需要替換庫即可,開發方便。
dlopen動態庫訪問
因專案需要多程序共享資源訪問.include include include typedef struct titem typedef structtbank typedef struct tbankctrl static titem g titem static tbank g tbank sta...
dlopen動態函式庫的載入。
前言 如論在linux上程式設計還是在windows上程式設計,為了程式的可擴充套件性,很多地方都用到了動態庫的載入。這裡來談談linux下的程式的動態函式庫的建立和載入。建立動態庫 在linux下邊編譯成so庫,gcc fpic shared c o lib so int add int a,in...
Linux 動態裝載庫(dlopen)
linux有時我們需要在執行時指定庫的路徑去載入庫,而不是依賴於系統自動動態鏈結。比如說我們在需要做到動態載入庫外掛程式時就會用到動態裝載庫的特性 比如像lighthttpd和nginx的動態mod功能 linux提供了函式來幫助我們做到這件事,主要的幾個函式為 dlopen,dlsym,dlclo...