動態配置指令碼實現之 鏈結庫方法提取

2021-07-03 04:17:18 字數 1138 閱讀 9941

上一次總結了,

動態配置指令碼實現之 flex,yacc應用, 

這個方法還是比較簡單額的,linux針對動態鏈結庫提供了相應的api,這裡主要用到一下兩個方法,

void *dlopen(const char *filename, int flag);

void *dlsym(void *handle, const char *symbol);

dlopen 用於載入動態庫檔案,其中flename 指定庫的路徑,flag 制定了載入的行為,這裡我使用了rtld_now,在載入過程中就解析所有未定義符號,以防止在將來的執行過程中出現問題,返回值是乙個 handle,將來再 dlsym 和dlclose 中使用。

dlsym 用於提取動態庫的各種symbol(函式,變數等)位址。

1. 編寫模組,動態鏈結庫

extmath.cpp, 關鍵**如下,這裡

expotrs_api 

就是我們庫提供的介面,

不要使用static宣告!

編譯生成動態庫  g++ extmath.cpp -fpic -shared -o libextmath.so

static int factorial(int n)

struct module_api expotrs_api = ,

}2. 再主程式中編寫從動態家在庫中提取方法的函式

關鍵**如下, 這裡需要 需要注意的是

不要使用dlclose 關閉載入庫,

int  moduleloader::loaderdynamiclibrary(const char *path)

struct module_api* mapi;

mapi = (struct module_api*)dlsym(handle, "expotrs_api");

printf("%s\n", mapi[0].name);

int i = 0;

while(1)

return 0;}

總結:這種方式,降低了各種模組之間的開發時的耦合性,但是在主程式注入外部方法的時候,還是需要一定的命名與函式方法約定(

kamailio中使用了更複雜的方法處理不同引數型別與引數個數)。

github **:

動態鏈結庫 實現

靜態鏈結 平台 windows2000 xp 工具 vc 6.0 建立步驟 1.新建專案 win32 static library 2 選擇pre pliled header 3 編輯標頭檔案和實現檔案 4 編譯 生成 lib檔案 參考 sum.h ifndef mysum define mysum...

ld 動態鏈結庫配置

一 ldconfig ldconfig是乙個動態鏈結庫管理命令,為了讓動態鏈結庫為系統所共享,還需執行動態鏈結庫的管理命令 ldconfig。ldconfig 命令的用途,主要是在預設搜尋目錄 lib和 usr lib 以及動態庫配置檔案 etc ld.so.conf內所列的目錄下,搜尋出可共享的動...

dll實現(動態鏈結庫)

下面我們實現自己的dll,並且利用乙個測試案例展示使用方法 第一部分 開發dll 注 環境 vs2010編譯器 新建win32 dll專案 新建乙個標頭檔案,和專案同名 在dll2.h裡新增 ifndef dll2 api define dll2 api declspec dllimport end...