轉自:http://cloverprince.iteye.com/blog/481309
現有一個主程式用C語言寫成。現在要允許第三方開發人員編寫擴充套件的模組,約定第三方開發的模組必須提供一系列已知名稱的函式(如 foo(),bar(),baz())。如果要求第三方的模組必須與主程式的二進位制程式碼分開發布,把dll或so丟在某個資料夾內即可被動態裝載並使用,應如何實現?
除了用作業系統提供的介面外,還可以用Glib的簡單封裝。GLib簡單封裝了作業系統相關的動態庫裝載函式,位於GModule中。GModule相當於Library
Handle,而g_module_open, g_module_symbol和g_module_close分別對應dlopen, dlsym和dlclose函式。
介面、動態庫同原解 http://cloverprince.iteye.com/blog/481309 ,新的主程式如下:
#include <stdio.h> #include <stdlib.h> #include <glib.h> #include <glib/gstdio.h> #include <gmodule.h> #include "plugin-interface.h" const char * const PLUGINS_PATH = "plugins"; int main(int argc, char** argv) { GDir *dir; const gchar *filename; dir = g_dir_open(PLUGINS_PATH,0,NULL); while(filename=g_dir_read_name(dir)) { GModule *module; char *path; InitModuleFunc init_func; PluginInterface iface; printf("Openning %s ...\n",filename); path = g_strdup_printf("%s/%s",PLUGINS_PATH,filename); module = g_module_open(path,G_MODULE_BIND_LAZY); g_module_symbol(module,"init_module",(void**)(&init_func)); init_func(&iface); iface.hello(); iface.greet("wks"); g_module_close(module); g_free(path); } g_dir_close(dir); return 0; }
編譯:
GLib程式的編譯可以利用pkg-config輔助設定編譯引數
引用
gcc $(pkg-config --cflags --libs glib-2.0 gmodule-2.0) -o main main.c