这是在Linux,64位,GCC 4.8.2下 .
我有一个应用程序,它由以下组成:
-
一个共享库(下面称为CORE),它是应用程序的核心,它实现了大部分逻辑,并且还处理加载我的自定义插件 .
-
链接到核心CORE的可执行文件(以下称为EXEC) . 它启动
QApplication
并使用CORE中的类,但也自己添加了一些类 . -
自定义插件,基于Qt的插件框架(即它们实现纯虚拟接口类,它们继承
QObject
等) . 所有插件都加载QPluginLoaded
并且它们正在工作 . Plugins loading is performed by the class from 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
问题:
它看起来像 plugins cannot use any symbols from EXEC ,即使它们由CORE加载,它由EXEC加载 . 这真的是一个案例吗?我认为正在运行的应用程序在运行时将所有符号提供给任何已加载的库 .
它编译得很好,但在运行时,当插件使用EXEC中的任何符号时,应用程序崩溃并显示消息:符号查找错误 .
使用CORE符号没有问题,插件无法使用EXEC符号 .
我确信编译符号实现 - 我已经用一个非常简单的案例进行了几次测试以避免任何复杂性 . 我还在午夜指挥官(F3键)中检查了符号,它在EXEC中就在那里 .
编辑:我刚刚测试了 QPluginLoader
创建 QPluginLoader
并且它上面的 load()
从EXEC二进制文件直接从 main()
函数调用它仍然没有像CORE中的符号那样"exported"来自EXEC的符号"exported"并且来自EXEC的符号不是......但是这是Linux,没有符号导出,对吧?
1 回答
正如我在自己对我的问题的评论中所怀疑的那样,传递给EXEC链接器的_1265315解决了这个问题 .