2010-01-21 51 views
3

在C工作共享庫,在UNIX的頂部,我加載和使用共享庫有點如下:編程在Unix上:與圖書館

... 

handle = dlopen("nameOfLib"); 

... 

libInit(); 

... 

libGoToState1(); 


libGoToState2(); 


.... 

libTerminate(); 

... 

dlclose(handle); 

... 

我想是我的申請承認'插件「,它採用可動態加載的庫的形式,遵循給定的API。

其中一個棘手的部分是,我想在調用libInit()後加載插件,我希望插件能夠調用libGoToSomeOtherState(),改變庫的狀態,但使用與應用程序相同的「會話」加載它。

任何想法,我需要如何去編碼這是值得讚賞的。

具體來說,需要進入插件和主程序的.c文件以便共享一個庫實例,狀態和全部內容?

+3

相關:http://stackoverflow.com/questions/1602398/linux-dlopen-can-a-library-be-notified-when-it-is-loaded – jldupont 2010-01-21 17:09:28

+0

你需要「輪候冊, - 出口動態「選項鍊接可執行文件時,如果你想動態庫回調到exe本身。 – 2010-01-21 17:19:44

回答

1

導出要由插件使用的接口的標準方式是將該接口本身放入插件鏈接到的共享庫中,或者將插件傳遞給函數指針的結構(在libInit()中,大概是這樣):然後用它來完成它的工作。

0

作爲一個簡短的提示,我會建議使用回調:將庫句柄傳遞給插件,或者使用插件內的函數指針調用原始庫函數。

1

該插件可以調用dlsym(RTLD_DEFAULT, "libGoToSomeOtherState")來獲取它想要調用的函數的地址,也可以直接將該函數指針傳遞給插件的init例程(也許在這樣的函數指針的表中)。