4

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

我已经成功地将我的代码添加到应用程序中,并且它链接得很好,因为整个应用程序都被同时链接了。但是,最终我希望我的代码成为一个单独的插件。

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

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

请注意,我仍在尝试构建我的插件——我还没有到尝试使用dlopen().

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

4

3 回答 3

2

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

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

于 2011-05-31T20:47:00.480 回答
1

我认为您想要链接器的“-R”(又名“--just-symbols”)选项。

所以如果myexe是主可执行文件:

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

PS 这假设它myexe本身与--export-dynamic. 否则,您的 .so 无法引用可执行文件中的符号,因为它们没有被导出。

于 2011-05-31T20:49:02.850 回答
1

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

于 2011-05-31T20:50:18.280 回答