从共享库中使用我的Qt插件时出现符号查找错误

时间:2014-07-10 20:28:00

标签: c++ linux qt

这是在Linux,64位,GCC 4.8.2。

我有一个由以下内容组成的应用程序:

  • 一个共享库(下面称为CORE),它是应用程序的核心,它实现了大部分逻辑,并且还处理加载我的自定义插件。
  • 一个可执行文件(以下称为EXEC),它链接到核心CORE。它启动QApplication并使用CORE中的类,但也可以自己添加更多类。
  • 自定义插件,基于Qt的插件框架(即它们实现纯虚拟接口类,它们继承QObject等)。所有插件都加载了QPluginLoaded,它们正在运行。 插件加载由CORE的类执行。

它可以或多或少地表示:

EXEC               <- this I run
 `- CORE.so        <- this is dynamically linked with EXEC
     +- plugin1.so <- those are loaded dynamically by QPluginLoader
     +- plugin2.so
     (...)
     `- pluginN.so

问题:

看起来插件不能使用EXEC中的任何符号,即使它们由CORE加载,也是由EXEC加载的。这真的是一个案例吗?我认为正在运行的应用程序在运行时将所有符号提供给任何已加载的库。

编译很好,但在运行时,当插件使用EXEC中的任何符号时,应用程序崩溃并显示消息:符号查找错误

使用CORE符号没有问题,插件无法使用EXEC符号。

我确信编译符号实现 - 我已经用一个非常简单的案例进行了几次测试,以避免任何复杂性。我还在午夜指挥官(F3键)中检查了符号,它在那里,在EXEC中。

编辑:我刚刚在创建QPluginLoader时测试了这种情况,并且直接从EXEC二进制文件中的load()函数调用main(),但它仍然不起作用。就像来自CORE的符号以某种方式“导出”而来自EXEC的符号不是......但这是Linux,没有符号导出,对吧?

1 个答案:

答案 0 :(得分:1)

正如我在自己对我的问题的评论中所怀疑的那样,传递给EXEC链接器的-rdynamic解决了这个问题。