2011-05-31 90 views
4

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

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

我在将代码构建为插件时遇到了问题。我将其构建为共享(.so)库。我的代码自然是指应用程序中的符号,所以我需要使用g++-L-l选项指定插件链接到的库。但是,接受我的插件的应用程序是一个可执行文件,而不是一组.so库。

我在这里错过了一些基本点。我如何链接我的插件?

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

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

+0

当你试图链接到另一个文件时,我不认为你需要'-L'和'-l'选项,只是'g ++ -o foo foo.cc bar'。 – sarnold 2011-05-31 20:45:45

+0

你为什么使用Fedora 11? – alternative 2011-05-31 20:58:08

回答

2

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

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

1

我想你想链接器的"-R" (aka. "--just-symbols")选项。

所以,如果myexe是主exectuable:

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

附:这假设myexe本身与--export-dynamic连接。否则,您的.so不能引用可执行文件中的符号,因为它们不会被导出。

1

设计应用程序是否使用插件?如果是这样,我会认为它的界面(并且缺乏)是设计不佳的。应用程序应该提供一个库,像您的插件可以利用,而不必诉诸于链接时变通办法和黑客。