【问题标题】:Use code in DLL from the loading binary使用加载二进制文件中的 DLL 中的代码
【发布时间】:2014-11-18 00:31:51
【问题描述】:

我目前正在尝试使用Qt的QPluginLoader来构建一个插件系统。在我将编译为 DLL (.so) 的插件中,我需要使用一些编译到主二进制文件中的类(它将加载插件)。

这不起作用,因为在运行时通过 QPluginLoader 加载将失败并显示错误消息:Cannot load library ... plugin.so.1.0.0: undefined symbol 。 ..

所以这些符号实际上在我的主二进制文件中,我想在我的 DLL 中使用它们...但是为什么这些符号对 DLL 不可用?有可能以某种方式实现这一目标吗? (希望有一些神奇的编译标志..)

注意:我可以将主程序的源代码编译到我的 DLL 中,但这在构建插件系统时听起来很愚蠢!

【问题讨论】:

  • .so 是共享对象,而不是 DLL。
  • 共享对象或动态链接库 - 谁在乎?同一事物的两个名字。在这种情况下,我在 Linux 下编译,如果我在 Windows 下编译,它会有一个 .dll 扩展名。
  • 不,阅读Drepper's paper: How To Write Shared Libraries。你会明白.so不是 DLL。

标签: c++ qt plugins dll shared-libraries


【解决方案1】:

编译标志-export-dynamic 将解决这个问题。以下是 gcc 文档中的描述:

在支持它的目标上将标志 -export-dynamic 传递给 ELF 链接器。这指示链接器将所有符号(不仅是使用的符号)添加到动态符号表中。 dlopen 的某些用途或允许从程序中获取回溯需要此选项。

【讨论】:

    猜你喜欢
    • 2015-01-25
    • 2021-02-20
    • 1970-01-01
    • 2016-11-05
    • 2013-03-06
    • 2010-12-07
    • 2012-09-30
    • 2010-12-08
    • 1970-01-01
    相关资源
    最近更新 更多