在Unix中编程:与库共享库

时间:2010-01-21 17:05:19

标签: c unix shared-libraries

在C语言中工作,在unix之上,我正在加载和使用共享库,如下所示:

...

handle = dlopen("nameOfLib");

...

libInit();

...

libGoToState1();


libGoToState2();


....

libTerminate();

...

dlclose(handle);

...

我希望我的应用程序允许“插件”采用符合给定API的动态可加载库的形式。

棘手的部分是我想在调用libInit()之后加载一个插件,我希望插件能够调用libGoToSomeOtherState(),改变库的状态,但是使用相同的'session'作为加载它的应用程序。

对于我需要如何对此进行编码的任何想法都表示赞赏。

具体来说,什么需要进入插件和主程序的.c文件,以便它们共享库实例,状态和所有?

4 个答案:

答案 0 :(得分:2)

我不确定这是否正是您正在寻找的,但是几天前在reddit上发布了一篇关于如何为C程序创建简单插件的文章:

http://thisxorthat.blogspot.com/2010/01/choose-indecision-simple-plugins-in-c.html

答案 1 :(得分:1)

导出插件使用的接口的标准方法是将该接口本身放入插件链接到的共享库中,或者将插件传递给函数指针的结构(在libInit()中,大概是然后它用它来完成它的工作。

答案 2 :(得分:1)

插件可以调用dlsym(RTLD_DEFAULT, "libGoToSomeOtherState")来获取它想要调用的函数的地址,或者你可以直接将该函数指针传递给插件的init例程(可能在这些函数指针的表中)。

答案 3 :(得分:0)

作为一个简短的提示,我建议使用回调:将库句柄传递给插件,或者使用插件中的函数指针调用原始库函数。