如何通过dlopen()链接插入应用程序的插件

时间:2011-05-31 20:41:28

标签: c++ plugins dlopen

我正在为应用程序编写插件。应用程序将使用dlopen()加载插件。该平台是Fedora Linux 11.我拥有该应用程序的所有源代码。

我已成功将我的代码添加到应用程序中,并且链接正常,因为整个应用程序一次被链接。但是,最终我希望我的代码是一个单独的插件。

我无法将代码构建为插件。我将它构建为共享(.so)库。我的代码自然是指应用程序中的符号,因此我需要使用g++ -L-l选项指定插件链接到的库。但是,接受我的插件的应用程序是单个可执行文件,而不是一组.so库。

我在这里遗漏了一些基本观点。如何链接我的插件?

请注意,我仍在尝试构建我的插件 - 我还没有尝试使用dlopen()加载它。

解决方案:谢谢大家的回答。我使用了nemo建议的--just-symbols方法,效果很好。谢谢!

3 个答案:

答案 0 :(得分:2)

一种方法是不要让插件直接链接到符号。 dlopen()能够使用NULL路径将当前进程作为“库”加载,但这需要在GCC中设置-rdynamic标志。这就是Glade如何工作,因为你在各种XML文件中设置回调,它只是“神奇地”起作用。

另一种方法是将一组函数指针传递给插件,这样它就不必链接到它们。当然,这需要为这种事情设计插件架构。

答案 1 :(得分:1)

我认为您需要链接器的"-R" (aka. "--just-symbols")选项。

所以如果myexe是主要的exectuable:

g++ -Wl,--just-symbols=myexe -L... -l... -shared -o plugin.so plugin.o

P.S。这预先假定myexe本身与--export-dynamic相关联。否则,你的.so不能引用可执行文件中的符号,因为它们不会被导出。

答案 2 :(得分:1)

应用程序是否设计为使用插件?如果是这样,我会争辩说它的界面(缺乏界面)设计得很差。该应用程序应该提供一个像您这样的插件可以利用的库,而不必诉诸于链接时间的变通方法和黑客攻击。