2010-01-21 50 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例程(也许在这样的函数指针的表中)。