上一次總結了,
動態配置指令碼實現之 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...