这是在Linux,64位,GCC 4.8.2。
我有一个由以下内容组成的应用程序:
QApplication
并使用CORE中的类,但也可以自己添加更多类。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,没有符号导出,对吧?
答案 0 :(得分:1)
正如我在自己对我的问题的评论中所怀疑的那样,传递给EXEC链接器的-rdynamic
解决了这个问题。